kanto-ds 1.5.2 → 1.6.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 (125) hide show
  1. package/README.md +10 -10
  2. package/dist/chunks/floating-B33g-M_1.js +63 -0
  3. package/dist/chunks/floating-B33g-M_1.js.map +1 -0
  4. package/dist/chunks/{index-STEEvEP7.js → index-TWJzttLX.js} +38 -15
  5. package/dist/chunks/index-TWJzttLX.js.map +1 -0
  6. package/dist/chunks/kt-calendar-CtwOby1R.js +780 -0
  7. package/dist/chunks/kt-calendar-CtwOby1R.js.map +1 -0
  8. package/dist/chunks/{kt-element-Djx2JcGl.js → kt-element-T0VbIBNp.js} +2 -2
  9. package/dist/chunks/{kt-element-Djx2JcGl.js.map → kt-element-T0VbIBNp.js.map} +1 -1
  10. package/dist/chunks/{listbox-llcUu_V-.js → listbox-LsUEyGhQ.js} +2 -2
  11. package/dist/chunks/{listbox-llcUu_V-.js.map → listbox-LsUEyGhQ.js.map} +1 -1
  12. package/dist/chunks/segmented-field-BBXR4XFL.js +384 -0
  13. package/dist/chunks/segmented-field-BBXR4XFL.js.map +1 -0
  14. package/dist/chunks/typed-date-CPAUNHzr.js +103 -0
  15. package/dist/chunks/typed-date-CPAUNHzr.js.map +1 -0
  16. package/dist/components/core/kt-avatar/kt-avatar.js +2 -2
  17. package/dist/components/core/kt-badge/kt-badge.js +2 -2
  18. package/dist/components/core/kt-button/kt-button.js +1 -1
  19. package/dist/components/core/kt-card/kt-card.js +1 -1
  20. package/dist/components/core/kt-code/kt-code.js +13 -13
  21. package/dist/components/core/kt-code/kt-code.js.map +1 -1
  22. package/dist/components/core/kt-icon/kt-icon.js +1 -1
  23. package/dist/components/core/kt-kbd/kt-kbd.js +5 -5
  24. package/dist/components/core/kt-kbd/kt-kbd.js.map +1 -1
  25. package/dist/components/core/kt-split-button/kt-split-button.js +3 -3
  26. package/dist/components/data/kt-chart/kt-chart.js +3 -3
  27. package/dist/components/data/kt-chart/kt-chart.js.map +1 -1
  28. package/dist/components/data/kt-meter/kt-meter.js +1 -1
  29. package/dist/components/data/kt-pagination/kt-pagination.js +2 -2
  30. package/dist/components/data/kt-stat/kt-stat.js +1 -1
  31. package/dist/components/data/kt-table/kt-table.js +85 -85
  32. package/dist/components/data/kt-table/kt-table.js.map +1 -1
  33. package/dist/components/data/kt-timeline/kt-timeline.js +1 -1
  34. package/dist/components/feedback/kt-alert/kt-alert.js +15 -15
  35. package/dist/components/feedback/kt-alert/kt-alert.js.map +1 -1
  36. package/dist/components/feedback/kt-empty-state/kt-empty-state.js +1 -1
  37. package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +1 -1
  38. package/dist/components/feedback/kt-skeleton/kt-skeleton.js +13 -13
  39. package/dist/components/feedback/kt-skeleton/kt-skeleton.js.map +1 -1
  40. package/dist/components/feedback/kt-toast/kt-toast.js +3 -3
  41. package/dist/components/feedback/kt-toast/kt-toast.js.map +1 -1
  42. package/dist/components/feedback/kt-toast-container/kt-toast-container.js +1 -1
  43. package/dist/components/feedback/kt-tooltip/kt-tooltip.js +1 -1
  44. package/dist/components/forms/kt-calendar/kt-calendar.d.ts +35 -9
  45. package/dist/components/forms/kt-calendar/kt-calendar.js +3 -3
  46. package/dist/components/forms/kt-checkbox/kt-checkbox.js +2 -2
  47. package/dist/components/forms/kt-date-input/kt-date-input.d.ts +65 -0
  48. package/dist/components/forms/kt-date-input/kt-date-input.js +241 -0
  49. package/dist/components/forms/kt-date-input/kt-date-input.js.map +1 -0
  50. package/dist/components/forms/kt-date-picker/kt-date-picker.d.ts +47 -3
  51. package/dist/components/forms/kt-date-picker/kt-date-picker.js +430 -199
  52. package/dist/components/forms/kt-date-picker/kt-date-picker.js.map +1 -1
  53. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +3 -3
  54. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js.map +1 -1
  55. package/dist/components/forms/kt-form/kt-form.js +2 -2
  56. package/dist/components/forms/kt-input/kt-input.js +10 -10
  57. package/dist/components/forms/kt-input/kt-input.js.map +1 -1
  58. package/dist/components/forms/kt-input-menu/kt-input-menu.js +4 -4
  59. package/dist/components/forms/kt-label-input/kt-label-input.js +1 -1
  60. package/dist/components/forms/kt-multi-select/kt-multi-select.d.ts +113 -0
  61. package/dist/components/forms/kt-multi-select/kt-multi-select.js +532 -0
  62. package/dist/components/forms/kt-multi-select/kt-multi-select.js.map +1 -0
  63. package/dist/components/forms/kt-radio-group/kt-radio-group.js +56 -51
  64. package/dist/components/forms/kt-radio-group/kt-radio-group.js.map +1 -1
  65. package/dist/components/forms/kt-select/kt-select.js +4 -4
  66. package/dist/components/forms/kt-textarea/kt-textarea.js +2 -2
  67. package/dist/components/forms/kt-time-input/kt-time-input.d.ts +48 -0
  68. package/dist/components/forms/kt-time-input/kt-time-input.js +114 -0
  69. package/dist/components/forms/kt-time-input/kt-time-input.js.map +1 -0
  70. package/dist/components/forms/kt-toggle/kt-toggle.js +1 -1
  71. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +6 -6
  72. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js.map +1 -1
  73. package/dist/components/navigation/kt-header/kt-header.js +2 -2
  74. package/dist/components/navigation/kt-page-header/kt-page-header.js +1 -1
  75. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +2 -2
  76. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +2 -2
  77. package/dist/components/navigation/kt-tabs/kt-tabs.js +2 -2
  78. package/dist/components/navigation/kt-tabs/kt-tabs.js.map +1 -1
  79. package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +1 -1
  80. package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +2 -2
  81. package/dist/components/overlays/kt-collapsible/kt-collapsible.js +3 -3
  82. package/dist/components/overlays/kt-collapsible/kt-collapsible.js.map +1 -1
  83. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +2 -2
  84. package/dist/components/overlays/kt-dropdown/kt-dropdown.js +24 -24
  85. package/dist/components/overlays/kt-dropdown/kt-dropdown.js.map +1 -1
  86. package/dist/components/overlays/kt-modal/kt-modal.js +2 -2
  87. package/dist/components/overlays/kt-side-panel/kt-side-panel.js +2 -2
  88. package/dist/custom-elements.json +2230 -842
  89. package/dist/index.d.ts +9 -1
  90. package/dist/index.js +316 -109
  91. package/dist/index.js.map +1 -1
  92. package/dist/internal/floating.d.ts +3 -0
  93. package/dist/internal/segmented-field.d.ts +114 -0
  94. package/dist/internal/segments.d.ts +30 -0
  95. package/dist/internal/strings.d.ts +30 -0
  96. package/dist/internal/typed-date.d.ts +33 -0
  97. package/dist/react/index.d.ts +23 -0
  98. package/dist/react/index.js +193 -169
  99. package/dist/react/index.js.map +1 -1
  100. package/dist/react/jsx.d.ts +20 -1
  101. package/dist/strings/index.js +1 -1
  102. package/dist/theme/accent.d.ts +51 -0
  103. package/dist/theme/appearance.d.ts +37 -0
  104. package/dist/tokens/README.md +100 -1
  105. package/dist/tokens/accents.css +80 -0
  106. package/dist/tokens/appearance.css +65 -0
  107. package/dist/tokens/base.css +3 -0
  108. package/dist/tokens/colors.css +78 -25
  109. package/dist/tokens/index.css +2 -0
  110. package/dist/tokens/responsive.css +160 -75
  111. package/dist/tokens/spacing.css +47 -28
  112. package/dist/tokens/theme-light.css +124 -38
  113. package/dist/tokens/typography.css +20 -13
  114. package/dist/vscode.css-custom-data.json +36 -1
  115. package/dist/vscode.html-custom-data.json +67 -2
  116. package/dist/vue/index.d.ts +6 -0
  117. package/dist/vue/index.js +11 -8
  118. package/dist/vue/index.js.map +1 -1
  119. package/dist/web-types.json +190 -3
  120. package/package.json +13 -1
  121. package/dist/chunks/floating-B7_Dahpn.js +0 -54
  122. package/dist/chunks/floating-B7_Dahpn.js.map +0 -1
  123. package/dist/chunks/index-STEEvEP7.js.map +0 -1
  124. package/dist/chunks/kt-calendar-B_hFdD9V.js +0 -640
  125. package/dist/chunks/kt-calendar-B_hFdD9V.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segmented-field-BBXR4XFL.js","sources":["../../src/internal/segments.ts","../../src/internal/segmented-field.ts"],"sourcesContent":["/**\n * The arithmetic of a segmented field — a day, a month, a year, an hour —\n * each typed digit by digit and stepped with the arrows. Pure, so the two\n * fields that share it, `<kt-date-input>` and `<kt-time-input>`, agree on\n * every key.\n */\n\nexport interface SegmentSpec {\n readonly min: number;\n readonly max: number;\n /** Digits when full: 2 for a day, 4 for a year. */\n readonly length: number;\n}\n\n/**\n * The segment's text once `digit` is typed, and whether the focus should move\n * on. It moves on when the segment is full, or as soon as no further digit\n * could follow — a day starting with 4 is the 4th. A digit that would\n * overshoot the maximum, or one typed into a full segment, starts it over.\n */\nexport function typeDigit(\n current: string,\n digit: string,\n spec: SegmentSpec,\n): { text: string; advance: boolean } {\n let text = current.length >= spec.length ? digit : current + digit;\n if (Number(text) > spec.max) text = digit;\n const advance = text.length >= spec.length || Number(text) * 10 > spec.max;\n return { text, advance };\n}\n\n/**\n * The value an arrow press lands on: the next multiple of the step — counted\n * from the minimum — in the direction of `by`, wrapping past either end. An\n * empty segment starts from its first value going up, its last going down.\n */\nexport function stepSegment(value: number | null, by: number, spec: SegmentSpec): number {\n const step = Math.abs(by) || 1;\n const first = spec.min;\n const last = spec.min + Math.floor((spec.max - spec.min) / step) * step;\n if (value === null) return by > 0 ? first : last;\n\n const offset = value - spec.min;\n if (by > 0) {\n const next = spec.min + (Math.floor(offset / step) + 1) * step;\n return next > spec.max ? first : next;\n }\n const next = offset % step === 0 ? value - step : spec.min + Math.floor(offset / step) * step;\n return next < spec.min ? last : next;\n}\n\n/** A value written with the segment's leading zeros: 4 → \"04\". */\nexport function padSegment(value: number, spec: SegmentSpec): string {\n return String(value).padStart(spec.length, '0');\n}\n","import { css, html, nothing, type PropertyValues, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { KtElement } from './kt-element.js';\nimport { emit, uniqueId } from './events.js';\nimport {\n attachFormInternals,\n setFormValue,\n setValidity,\n type UsableInternals,\n} from './form-control.js';\nimport { resolveLocale } from './locale.js';\nimport { padSegment, stepSegment, typeDigit, type SegmentSpec } from './segments.js';\n\n/** One part of a segmented field: a number typed digit by digit, or one of a few words. */\nexport interface Segment {\n readonly key: string;\n readonly label: string;\n /** What the segment shows while empty: \"dd\", \"--\". */\n readonly placeholder: string;\n /** A number, typed and stepped within these bounds… */\n readonly spec?: SegmentSpec;\n /** …stepped by this much with the arrows… */\n readonly step?: number;\n /** …or one of these words, picked by its first letter: AM, PM. */\n readonly choices?: readonly string[];\n}\n\n/** What a segmented field is made of: segments, and the characters between them. */\nexport type FieldItem = Segment | { readonly literal: string };\n\nconst isSegment = (item: FieldItem): item is Segment => 'key' in item;\n\n/** Characters that move on to the next segment, as a typist expects. */\nconst SEPARATORS = new Set(['/', '.', '-', ':', ',', ' ']);\n\nexport type KtSegmentedFieldSize = 'small' | 'medium' | 'large';\n\n/**\n * The common ground of `<kt-date-input>` and `<kt-time-input>`: a field of\n * segments — a day, a month, an hour — each its own spinbutton, typed digit by\n * digit, stepped with the arrows, the focus moving on as each fills.\n *\n * Each segment is `contenteditable`, so a phone shows its number pad, but the\n * text never changes behind the field's back: every keystroke and every input\n * event is turned into the segment's new value here. A subclass says what its\n * segments are, how they read into a value, and how a value fills them.\n */\nexport abstract class KtSegmentedField extends KtElement {\n static readonly formAssociated = true;\n\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n --field-height: var(--button-height);\n }\n :host([size='small']) {\n --field-height: var(--button-height-small);\n }\n :host([size='large']) {\n --field-height: var(--button-height-large);\n }\n\n /* The field as kt-input draws one: a fill with a resting hairline, an\n outline on hover and focus that never reflows it. */\n .field {\n display: flex;\n align-items: center;\n gap: var(--gap-element);\n height: var(--field-height);\n /* Less the segment's own padding, so the digits line up with a\n kt-input's text. */\n padding: 0 10px 0 calc(var(--button-padding-x) - 2px);\n color: var(--text-body);\n font: var(--font-input);\n background-color: var(--surface-field);\n border: var(--border-width) solid var(--border-field);\n border-radius: var(--radius-input);\n outline: var(--outline-width) solid transparent;\n cursor: text;\n transition: outline-color var(--duration-instant);\n }\n .field:hover {\n outline: var(--outline-width) solid var(--color-text-700);\n }\n .field:focus-within,\n .field.open {\n outline: var(--outline-width) solid var(--color-primary-base);\n }\n .field.error,\n .field.error:hover,\n .field.error:focus-within {\n outline: var(--outline-width) solid var(--color-danger-base);\n }\n .field.disabled {\n color: var(--text-disabled);\n background-color: var(--color-dark-14);\n cursor: not-allowed;\n }\n\n .segments {\n display: flex;\n flex: 1;\n align-items: center;\n min-width: 0;\n font-variant-numeric: tabular-nums;\n }\n\n /* A segment takes a tint while it has focus, so it is plain which part\n a digit will go into; the caret itself would only flicker. */\n .segment {\n padding: 1px 2px;\n border-radius: calc(4px * var(--radius-scale, 1));\n outline: none;\n caret-color: transparent;\n white-space: nowrap;\n }\n .segment.empty {\n color: var(--text-muted);\n }\n .segment:focus {\n color: var(--color-primary-text);\n background: var(--color-primary-soft);\n }\n .error .segment:not(.empty) {\n color: var(--color-danger-text);\n }\n .literal {\n padding: 0 1px;\n color: var(--text-muted);\n }\n\n .error-icon {\n flex: none;\n color: var(--color-danger-text);\n }\n `,\n ];\n\n protected internals: UsableInternals | null = null;\n private defaultValue: string | null = null;\n /** Set while the field writes its own value, which should not refill it. */\n private committing = false;\n protected readonly errorId = uniqueId('kt-segmented-error');\n\n /** What each segment holds, by key: digits, or the index of a choice. */\n @state() protected texts: Record<string, string> = {};\n /** Why the segments do not make a value, when they are all filled. */\n @state() protected typedError = '';\n @state() private focusedKey: string | null = null;\n /** Disabled by an enclosing `<fieldset>`, which leaves `disabled` alone. */\n @state() private formDisabled = false;\n\n @property({ type: String, reflect: true })\n value: string | null = null;\n\n @property({ type: String })\n name = '';\n\n /** Accessible name of the field, when no `<kt-label-input>` wraps it. */\n @property({ type: String })\n label = '';\n\n /** BCP 47 locale for the order and names of the segments. Empty: page, then browser. */\n @property({ type: String })\n locale = '';\n\n @property({ type: String })\n min = '';\n\n @property({ type: String })\n max = '';\n\n @property({ type: String, reflect: true })\n size: KtSegmentedFieldSize = 'medium';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: Boolean, reflect: true })\n required = false;\n\n /** Error message. A non-empty value puts the field in its error state. */\n @property({ type: String, reflect: true })\n error = '';\n\n // --- What a subclass says ---\n\n /** The segments, in order, with what goes between them. */\n protected abstract items(): FieldItem[];\n /** What each segment holds for a value. */\n protected abstract fill(value: string | null): Record<string, string>;\n /** The value the segments make — null until they all hold something — and why not, if not. */\n protected abstract read(texts: Record<string, string>): { value: string | null; error: string };\n /** The message of a required field left empty. */\n protected abstract requiredMessage(): string;\n /** Anything after the segments: a calendar button. */\n protected renderAfter(): TemplateResult | typeof nothing {\n return nothing;\n }\n /**\n * What a segment left half-typed becomes when the focus leaves it — a\n * two-digit year written out — or null to leave it as typed.\n */\n protected completeOnBlur(_segment: Segment, _text: string): string | null {\n return null;\n }\n /** Whether a popup belonging to the field is open, for the field's outline. */\n protected get expanded(): boolean {\n return false;\n }\n\n // --- Lifecycle ---\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.internals ??= attachFormInternals(this);\n this.defaultValue = this.value;\n this.texts = this.fill(this.value);\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n // A value set from outside fills the segments; one the field wrote does not.\n if ((changed.has('value') || changed.has('locale')) && !this.committing) {\n this.texts = this.fill(this.value);\n this.typedError = '';\n }\n this.committing = false;\n\n if (\n changed.has('value') ||\n changed.has('required') ||\n changed.has('error') ||\n changed.has('typedError' as keyof KtSegmentedField) ||\n this.stringsChanged(changed)\n ) {\n setFormValue(this.internals, this.value);\n const missing = this.required && this.value === null && !this.typedError;\n setValidity(\n this.internals,\n {\n valueMissing: missing,\n badInput: Boolean(this.typedError),\n customError: Boolean(this.error),\n },\n this.error || this.typedError || (missing ? this.requiredMessage() : ''),\n );\n }\n }\n\n formResetCallback(): void {\n this.value = this.defaultValue;\n this.texts = this.fill(this.value);\n this.typedError = '';\n }\n\n /**\n * Called by the platform when the control's disabled state changes — its\n * own `disabled`, or an ancestor `<fieldset disabled>` it cannot see.\n */\n formDisabledCallback(disabled: boolean): void {\n this.formDisabled = disabled;\n }\n\n /** Called by the platform when the browser restores a session. */\n formStateRestoreCallback(state: string | null): void {\n this.value = state;\n }\n\n /** Focuses the first segment. */\n override focus(options?: FocusOptions): void {\n this.segmentElements()[0]?.focus(options);\n }\n\n protected get inactive(): boolean {\n return this.disabled || this.formDisabled;\n }\n\n protected get resolvedLocale(): string {\n return resolveLocale(this.locale);\n }\n\n // --- Values ---\n\n /** Sets a value chosen outside the segments — a day picked in a calendar. */\n protected commitValue(value: string | null): void {\n this.texts = this.fill(value);\n this.typedError = '';\n this.apply(value);\n }\n\n private setText(key: string, text: string): void {\n this.texts = { ...this.texts, [key]: text };\n const { value, error } = this.read(this.texts);\n this.typedError = error;\n this.apply(value);\n }\n\n private apply(value: string | null): void {\n if (value === this.value) return;\n this.committing = true;\n this.value = value;\n emit(this, 'kt-change', { value });\n }\n\n // --- Keyboard ---\n\n private segmentElements(): HTMLElement[] {\n return [...(this.shadowRoot?.querySelectorAll<HTMLElement>('[role=\"spinbutton\"]') ?? [])];\n }\n\n private focusSegment(index: number): void {\n this.segmentElements()[index]?.focus();\n }\n\n /** One key's effect on a segment; true when the key was the field's to handle. */\n private applyKey(key: string, segment: Segment, index: number): boolean {\n const text = this.texts[segment.key] ?? '';\n\n if (/^\\d$/.test(key) && segment.spec) {\n const typed = typeDigit(text, key, segment.spec);\n this.setText(segment.key, typed.text);\n if (typed.advance) this.focusSegment(index + 1);\n return true;\n }\n if (segment.choices && /^\\p{L}$/u.test(key)) {\n const pick = segment.choices.findIndex((choice) =>\n choice.toLowerCase().startsWith(key.toLowerCase()),\n );\n if (pick >= 0) {\n this.setText(segment.key, String(pick));\n this.focusSegment(index + 1);\n }\n return true;\n }\n\n switch (key) {\n case 'ArrowUp':\n case 'ArrowDown': {\n const by = key === 'ArrowUp' ? 1 : -1;\n if (segment.spec) {\n const current = text === '' ? null : Number(text);\n const next = stepSegment(current, by * (segment.step ?? 1), segment.spec);\n this.setText(segment.key, padSegment(next, segment.spec));\n } else if (segment.choices) {\n const count = segment.choices.length;\n const current = text === '' ? (by > 0 ? -1 : 0) : Number(text);\n this.setText(segment.key, String((current + by + count) % count));\n }\n return true;\n }\n case 'Home':\n case 'End':\n if (segment.spec) {\n const bound = key === 'Home' ? segment.spec.min : segment.spec.max;\n this.setText(segment.key, padSegment(bound, segment.spec));\n }\n return true;\n case 'ArrowLeft':\n this.focusSegment(index - 1);\n return true;\n case 'ArrowRight':\n this.focusSegment(index + 1);\n return true;\n case 'Backspace':\n case 'Delete':\n // Erase a digit at a time; once empty, Backspace goes back a segment.\n if (text) this.setText(segment.key, segment.choices ? '' : text.slice(0, -1));\n else if (key === 'Backspace') this.focusSegment(index - 1);\n return true;\n default:\n if (SEPARATORS.has(key)) {\n if (text) this.focusSegment(index + 1);\n return true;\n }\n // Any other character would land in the contenteditable as text.\n return key.length === 1;\n }\n }\n\n private onKeyDown(event: KeyboardEvent, segment: Segment, index: number): void {\n if (this.inactive || event.metaKey || event.ctrlKey || event.altKey) return;\n if (this.applyKey(event.key, segment, index)) event.preventDefault();\n }\n\n /**\n * What a phone's keyboard sends: input events rather than key presses.\n * The text is never left to the browser; each character goes through the\n * same path as a key.\n */\n private onBeforeInput(event: InputEvent, segment: Segment, index: number): void {\n event.preventDefault();\n if (this.inactive) return;\n if (event.inputType.startsWith('delete')) {\n this.applyKey('Backspace', segment, index);\n return;\n }\n for (const character of event.data ?? '') this.applyKey(character, segment, index);\n }\n\n /** A click on the field's padding or separators lands in its first empty segment. */\n private onFieldClick(event: MouseEvent): void {\n if (this.inactive) return;\n if ((event.target as HTMLElement).closest('[role=\"spinbutton\"], button, kt-tooltip')) return;\n const segments = this.items().filter(isSegment);\n const empty = segments.findIndex((segment) => !this.texts[segment.key]);\n this.focusSegment(empty >= 0 ? empty : segments.length - 1);\n }\n\n // --- Rendering ---\n\n private renderSegment(segment: Segment, index: number): TemplateResult {\n const text = this.texts[segment.key] ?? '';\n const focused = this.focusedKey === segment.key;\n let shown = segment.placeholder;\n let now: number | typeof nothing = nothing;\n if (text !== '') {\n now = Number(text);\n if (segment.choices) shown = segment.choices[Number(text)] ?? '';\n else if (segment.spec) shown = focused ? text : padSegment(Number(text), segment.spec);\n }\n\n return html`<span\n part=\"segment\"\n role=\"spinbutton\"\n class=${classMap({ segment: true, empty: text === '' })}\n data-key=${segment.key}\n tabindex=${this.inactive ? -1 : 0}\n contenteditable=${this.inactive ? 'false' : 'true'}\n inputmode=${segment.spec ? 'numeric' : 'text'}\n spellcheck=\"false\"\n autocorrect=\"off\"\n enterkeyhint=\"next\"\n aria-label=${segment.label}\n aria-valuemin=${segment.spec ? segment.spec.min : nothing}\n aria-valuemax=${segment.spec ? segment.spec.max : nothing}\n aria-valuenow=${now}\n aria-valuetext=${text === '' ? segment.placeholder : shown}\n aria-disabled=${this.inactive ? 'true' : nothing}\n @keydown=${(event: KeyboardEvent) => this.onKeyDown(event, segment, index)}\n @beforeinput=${(event: InputEvent) => this.onBeforeInput(event, segment, index)}\n @focus=${() => {\n this.focusedKey = segment.key;\n }}\n @blur=${() => {\n this.focusedKey = null;\n const completed = this.completeOnBlur(segment, this.texts[segment.key] ?? '');\n if (completed !== null && completed !== this.texts[segment.key]) {\n this.setText(segment.key, completed);\n }\n }}\n >${shown}</span\n >`;\n }\n\n override render(): TemplateResult {\n const error = this.error || this.typedError;\n let index = -1;\n\n return html`${\n error ? html`<span id=${this.errorId} class=\"visually-hidden\">${error}</span>` : nothing\n }\n <div\n part=\"field\"\n class=${classMap({\n field: true,\n error: Boolean(error),\n disabled: this.inactive,\n open: this.expanded,\n })}\n role=\"group\"\n aria-label=${this.label || nothing}\n aria-invalid=${error ? 'true' : nothing}\n aria-describedby=${error ? this.errorId : nothing}\n @click=${this.onFieldClick}\n >\n <div class=\"segments\">\n ${this.items().map((item) => {\n if (!isSegment(item)) {\n return html`<span class=\"literal\" aria-hidden=\"true\">${item.literal}</span>`;\n }\n index += 1;\n return this.renderSegment(item, index);\n })}\n </div>\n ${\n error\n ? html`<kt-tooltip class=\"error-icon\" text=${error} ?open=${this.focusedKey !== null}>\n <kt-icon name=\"circle-alert\" size=\"18\"></kt-icon>\n </kt-tooltip>`\n : nothing\n }\n ${this.renderAfter()}\n </div>`;\n }\n}\n"],"names":["typeDigit","current","digit","spec","text","advance","stepSegment","value","by","step","first","last","offset","next","padSegment","isSegment","item","SEPARATORS","KtSegmentedField","KtElement","uniqueId","css","nothing","_segment","_text","attachFormInternals","changed","setFormValue","missing","setValidity","disabled","state","options","resolveLocale","key","error","emit","index","segment","typed","pick","choice","count","bound","event","character","segments","empty","focused","shown","now","html","classMap","completed","__decorateClass","property"],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ import { c as w, p as x, d as $ } from "./kt-calendar-CtwOby1R.js";
2
+ import { d } from "./locale-C5xLkGx5.js";
3
+ function y(t) {
4
+ return t.normalize("NFD").replace(/\p{Diacritic}/gu, "").replace(/\.$/, "").toLowerCase();
5
+ }
6
+ function z(t) {
7
+ const e = d(t, {
8
+ day: "2-digit",
9
+ month: "2-digit",
10
+ year: "numeric"
11
+ }).formatToParts(new Date(2026, 8, 30)).find((o) => o.type === "literal")?.value.trim() || "/";
12
+ return { order: T(t), separator: e };
13
+ }
14
+ function T(t) {
15
+ const n = d(t, { day: "2-digit", month: "2-digit", year: "numeric" }).formatToParts(new Date(2026, 8, 30)).map((e) => e.type).filter((e) => ["day", "month", "year"].includes(e));
16
+ return n.length === 3 ? n : ["day", "month", "year"];
17
+ }
18
+ function F(t, n) {
19
+ const e = y(t);
20
+ if (e.length < 3) return null;
21
+ const o = /* @__PURE__ */ new Set();
22
+ for (let u = 1; u <= 12; u += 1) {
23
+ const r = new Date(2026, u - 1, 1), a = y(d(n, { month: "long" }).format(r)), i = y(d(n, { month: "short" }).format(r));
24
+ (a.startsWith(e) || i === e) && o.add(u);
25
+ }
26
+ return o.size === 1 ? [...o][0] : null;
27
+ }
28
+ function p(t, n) {
29
+ if (t.length === 4) return Number(t);
30
+ if (t.length > 2) return null;
31
+ const e = 2e3 + Number(t);
32
+ return e > n + 20 ? e - 100 : e;
33
+ }
34
+ function h(t, n, e) {
35
+ return n < 1 || n > 12 || e < 1 || e > $(t, n) ? null : { year: t, month: n, day: e };
36
+ }
37
+ function g(t, n, e) {
38
+ const o = t.trim();
39
+ if (!o) return null;
40
+ const u = /^\d{4}-\d{1,2}-\d{1,2}$/.test(o) ? x(o.replace(/-(\d)(?=-|$)/g, "-0$1")) : null;
41
+ if (u) return { date: u, typedYear: !0 };
42
+ const r = [];
43
+ let a = null;
44
+ for (const l of o.split(/[\s/.,-]+/).filter(Boolean)) {
45
+ if (/^\d+$/.test(l)) {
46
+ r.push(l);
47
+ continue;
48
+ }
49
+ const s = F(l, n);
50
+ if (s === null || a !== null) return null;
51
+ a = s;
52
+ }
53
+ if (a !== null) {
54
+ if (r.length === 0 || r.length > 2) return null;
55
+ const l = r.findIndex((c) => c.length === 4 || Number(c) > 31), s = r.find((c, Y) => Y !== l);
56
+ if (s === void 0 || r.length === 2 && l < 0) return null;
57
+ const N = l >= 0 ? p(r[l], e.year) : e.year;
58
+ if (N === null) return null;
59
+ const v = h(N, a, Number(s));
60
+ return v && { date: v, typedYear: l >= 0 };
61
+ }
62
+ if (r.length < 2 || r.length > 3) return null;
63
+ const i = r[0].length === 4 ? ["year", "month", "day"] : I(T(n), r.length), f = (l) => r[i.indexOf(l)], m = f("year"), D = m === void 0 ? e.year : p(m, e.year);
64
+ if (D === null) return null;
65
+ const b = h(D, Number(f("month")), Number(f("day")));
66
+ return b && { date: b, typedYear: m !== void 0 };
67
+ }
68
+ function I(t, n) {
69
+ return n === 3 ? t : t.filter((e) => e !== "year");
70
+ }
71
+ function L(t, n) {
72
+ return p(t, n);
73
+ }
74
+ function P(t, n, e) {
75
+ return g(t, n, e)?.date ?? null;
76
+ }
77
+ function B(t, n, e) {
78
+ const o = t.split(/\s*[–—]\s*|\s+-\s+|\s+(?:to|au|bis|à)\s+/i);
79
+ if (o.length !== 2) return null;
80
+ const u = g(o[1], n, e);
81
+ if (!u) return null;
82
+ const r = g(o[0], n, { ...e, year: u.date.year });
83
+ if (!r) return null;
84
+ let a = r.date;
85
+ if (!r.typedYear && w(a, u.date) > 0) {
86
+ const i = h(a.year - 1, a.month, a.day);
87
+ i && (a = i);
88
+ }
89
+ return w(a, u.date) <= 0 ? { start: a, end: u.date } : { start: u.date, end: a };
90
+ }
91
+ function C(t, n) {
92
+ return d(t, { day: "2-digit", month: "2-digit", year: "numeric" }).format(
93
+ new Date(n.year, n.month - 1, n.day, 12)
94
+ );
95
+ }
96
+ export {
97
+ P as a,
98
+ z as d,
99
+ C as e,
100
+ B as p,
101
+ L as t
102
+ };
103
+ //# sourceMappingURL=typed-date-CPAUNHzr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typed-date-CPAUNHzr.js","sources":["../../src/internal/typed-date.ts"],"sourcesContent":["/**\n * Reading a date someone typed, in their language.\n *\n * A field that only opens a calendar makes a date ten years away, or one\n * already on paper, a chore. Typed, it is a second's work — if the field reads\n * it the way the person writes it: day then month in London, month then day in\n * New York, month names in their own words, the year left out when it is this\n * one.\n */\nimport { daysInMonth, parseDate, compareDates, type PlainDate } from './date.js';\nimport { dateFormat } from './locale.js';\n\n/** Lowercase, without accents or a trailing full stop: \"Févr.\" reads \"fevr\". */\nfunction fold(text: string): string {\n return text\n .normalize('NFD')\n .replace(/\\p{Diacritic}/gu, '')\n .replace(/\\.$/, '')\n .toLowerCase();\n}\n\n/**\n * How the language writes a date in numbers: the order of day, month and year,\n * and what goes between them — `25/09/2026`, `09/25/2026`, `25.09.2026`.\n */\nexport function dateLayout(locale: string): {\n order: ('day' | 'month' | 'year')[];\n separator: string;\n} {\n const parts = dateFormat(locale, {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n }).formatToParts(new Date(2026, 8, 30));\n const separator = parts.find((part) => part.type === 'literal')?.value.trim() || '/';\n return { order: numericOrder(locale), separator };\n}\n\n/** The order the language writes day, month and year in numbers. */\nfunction numericOrder(locale: string): ('day' | 'month' | 'year')[] {\n const parts = dateFormat(locale, { day: '2-digit', month: '2-digit', year: 'numeric' })\n .formatToParts(new Date(2026, 8, 30))\n .map((part) => part.type)\n .filter((type): type is 'day' | 'month' | 'year' => ['day', 'month', 'year'].includes(type));\n return parts.length === 3 ? parts : ['day', 'month', 'year'];\n}\n\n/** The month a word names in the language, or null when it names none or several. */\nfunction monthNamed(word: string, locale: string): number | null {\n const typed = fold(word);\n if (typed.length < 3) return null;\n\n const matches = new Set<number>();\n for (let month = 1; month <= 12; month += 1) {\n const sample = new Date(2026, month - 1, 1);\n const long = fold(dateFormat(locale, { month: 'long' }).format(sample));\n const short = fold(dateFormat(locale, { month: 'short' }).format(sample));\n if (long.startsWith(typed) || short === typed) matches.add(month);\n }\n return matches.size === 1 ? [...matches][0]! : null;\n}\n\n/** A typed year: two digits are this century, or the last, whichever is nearer. */\nfunction readYear(digits: string, reference: number): number | null {\n if (digits.length === 4) return Number(digits);\n if (digits.length > 2) return null;\n const year = 2000 + Number(digits);\n return year > reference + 20 ? year - 100 : year;\n}\n\nfunction valid(year: number, month: number, day: number): PlainDate | null {\n if (month < 1 || month > 12 || day < 1 || day > daysInMonth(year, month)) return null;\n return { year, month, day };\n}\n\n/** The date, and whether a year was typed or borrowed. */\nfunction read(\n text: string,\n locale: string,\n reference: PlainDate,\n): { date: PlainDate; typedYear: boolean } | null {\n const trimmed = text.trim();\n if (!trimmed) return null;\n\n const iso = /^\\d{4}-\\d{1,2}-\\d{1,2}$/.test(trimmed)\n ? parseDate(trimmed.replace(/-(\\d)(?=-|$)/g, '-0$1'))\n : null;\n if (iso) return { date: iso, typedYear: true };\n\n const numbers: string[] = [];\n let named: number | null = null;\n for (const token of trimmed.split(/[\\s/.,-]+/).filter(Boolean)) {\n if (/^\\d+$/.test(token)) {\n numbers.push(token);\n continue;\n }\n const month = monthNamed(token, locale);\n if (month === null || named !== null) return null;\n named = month;\n }\n\n if (named !== null) {\n // \"25 Sept 2026\", \"Sep 25, 2026\", \"3 march\": the day, and maybe a year.\n if (numbers.length === 0 || numbers.length > 2) return null;\n const yearIndex = numbers.findIndex((token) => token.length === 4 || Number(token) > 31);\n const dayToken = numbers.find((_, index) => index !== yearIndex);\n if (dayToken === undefined || (numbers.length === 2 && yearIndex < 0)) return null;\n const year = yearIndex >= 0 ? readYear(numbers[yearIndex]!, reference.year) : reference.year;\n if (year === null) return null;\n const date = valid(year, named, Number(dayToken));\n return date && { date, typedYear: yearIndex >= 0 };\n }\n\n // All numbers, in the language's order; a leading four-digit year reads ISO-wise.\n if (numbers.length < 2 || numbers.length > 3) return null;\n const order =\n numbers[0]!.length === 4\n ? (['year', 'month', 'day'] as const)\n : numberOrderFor(numericOrder(locale), numbers.length);\n const field = (name: 'day' | 'month' | 'year') => numbers[order.indexOf(name)];\n\n const yearToken = field('year');\n const year = yearToken === undefined ? reference.year : readYear(yearToken, reference.year);\n if (year === null) return null;\n const date = valid(year, Number(field('month')), Number(field('day')));\n return date && { date, typedYear: yearToken !== undefined };\n}\n\n/** Two numbers are the day and month, in the language's order, with the year left out. */\nfunction numberOrderFor(\n order: ('day' | 'month' | 'year')[],\n count: number,\n): readonly ('day' | 'month' | 'year')[] {\n return count === 3 ? order : order.filter((part) => part !== 'year');\n}\n\n/** A typed year: two digits are this century or the last, whichever is nearer. */\nexport function typedYear(digits: string, reference: number): number | null {\n return readYear(digits, reference);\n}\n\n/** A date typed in `locale`, or null when it does not read as one. */\nexport function parseTypedDate(\n text: string,\n locale: string,\n reference: PlainDate,\n): PlainDate | null {\n return read(text, locale, reference)?.date ?? null;\n}\n\n/**\n * A period typed as two dates around a dash — \"1/9 – 25/9/2026\" — in order.\n * A start typed without a year borrows the end's, the year before if that\n * would put it after the end: \"20/12 – 5/1/2027\" starts in December 2026.\n */\nexport function parseTypedRange(\n text: string,\n locale: string,\n reference: PlainDate,\n): { start: PlainDate; end: PlainDate } | null {\n const halves = text.split(/\\s*[–—]\\s*|\\s+-\\s+|\\s+(?:to|au|bis|à)\\s+/i);\n if (halves.length !== 2) return null;\n\n const end = read(halves[1]!, locale, reference);\n if (!end) return null;\n const start = read(halves[0]!, locale, { ...reference, year: end.date.year });\n if (!start) return null;\n\n let from = start.date;\n if (!start.typedYear && compareDates(from, end.date) > 0) {\n const earlier = valid(from.year - 1, from.month, from.day);\n if (earlier) from = earlier;\n }\n return compareDates(from, end.date) <= 0\n ? { start: from, end: end.date }\n : { start: end.date, end: from };\n}\n\n/** `reference` written in numbers the way `locale` writes a date — for a hint. */\nexport function exampleDate(locale: string, reference: PlainDate): string {\n return dateFormat(locale, { day: '2-digit', month: '2-digit', year: 'numeric' }).format(\n new Date(reference.year, reference.month - 1, reference.day, 12),\n );\n}\n"],"names":["fold","text","dateLayout","locale","separator","dateFormat","part","numericOrder","parts","type","monthNamed","word","typed","matches","month","sample","long","short","readYear","digits","reference","year","valid","day","daysInMonth","read","trimmed","iso","parseDate","numbers","named","token","yearIndex","dayToken","_","index","date","order","numberOrderFor","field","name","yearToken","count","typedYear","parseTypedDate","parseTypedRange","halves","end","start","from","compareDates","earlier","exampleDate"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { css as p, nothing as f, html as n } from "lit";
2
2
  import { state as v, property as o } from "lit/decorators.js";
3
3
  import { classMap as c } from "lit/directives/class-map.js";
4
- import { K as d, d as g } from "../../../chunks/kt-element-Djx2JcGl.js";
5
- import { s as m } from "../../../chunks/index-STEEvEP7.js";
4
+ import { K as d, d as g } from "../../../chunks/kt-element-T0VbIBNp.js";
5
+ import { s as m } from "../../../chunks/index-TWJzttLX.js";
6
6
  import "../kt-icon/kt-icon.js";
7
7
  var y = Object.defineProperty, s = (a, e, t, k) => {
8
8
  for (var i = void 0, l = a.length - 1, h; l >= 0; l--)
@@ -2,9 +2,9 @@ import { css as h, nothing as n, html as l } from "lit";
2
2
  import { property as e } from "lit/decorators.js";
3
3
  import { classMap as b } from "lit/directives/class-map.js";
4
4
  import { styleMap as m } from "lit/directives/style-map.js";
5
- import { K as p, d as v } from "../../../chunks/kt-element-Djx2JcGl.js";
5
+ import { K as p, d as v } from "../../../chunks/kt-element-T0VbIBNp.js";
6
6
  import { e as u } from "../../../chunks/events-r51msXNf.js";
7
- import { s as g } from "../../../chunks/index-STEEvEP7.js";
7
+ import { s as g } from "../../../chunks/index-TWJzttLX.js";
8
8
  import "../kt-icon/kt-icon.js";
9
9
  var f = Object.defineProperty, t = (s, r, i, y) => {
10
10
  for (var a = void 0, c = s.length - 1, d; c >= 0; c--)
@@ -1,7 +1,7 @@
1
1
  import { css as h, html as d, nothing as i } from "lit";
2
2
  import { property as e } from "lit/decorators.js";
3
3
  import { classMap as p } from "lit/directives/class-map.js";
4
- import { K as u, d as v } from "../../../chunks/kt-element-Djx2JcGl.js";
4
+ import { K as u, d as v } from "../../../chunks/kt-element-T0VbIBNp.js";
5
5
  import "../kt-icon/kt-icon.js";
6
6
  var g = Object.defineProperty, a = (l, t, o, y) => {
7
7
  for (var n = void 0, c = l.length - 1, s; c >= 0; c--)
@@ -2,7 +2,7 @@ import { css as f, nothing as r, html as d } from "lit";
2
2
  import { state as g, property as a } from "lit/decorators.js";
3
3
  import { classMap as n } from "lit/directives/class-map.js";
4
4
  import { styleMap as u } from "lit/directives/style-map.js";
5
- import { K as m, d as v } from "../../../chunks/kt-element-Djx2JcGl.js";
5
+ import { K as m, d as v } from "../../../chunks/kt-element-T0VbIBNp.js";
6
6
  import { e as b } from "../../../chunks/events-r51msXNf.js";
7
7
  import { h as p } from "../../../chunks/slots-BPbIdxAJ.js";
8
8
  var y = Object.defineProperty, i = (s, e, c, k) => {
@@ -1,8 +1,8 @@
1
- import { css as b, nothing as s, html as d } from "lit";
2
- import { state as m, property as c } from "lit/decorators.js";
3
- import { K as h, d as v } from "../../../chunks/kt-element-Djx2JcGl.js";
1
+ import { css as b, nothing as s, html as c } from "lit";
2
+ import { state as v, property as d } from "lit/decorators.js";
3
+ import { K as h, d as m } from "../../../chunks/kt-element-T0VbIBNp.js";
4
4
  import { e as g } from "../../../chunks/events-r51msXNf.js";
5
- import { s as r } from "../../../chunks/index-STEEvEP7.js";
5
+ import { s as r } from "../../../chunks/index-TWJzttLX.js";
6
6
  import "../kt-icon/kt-icon.js";
7
7
  var y = Object.defineProperty, a = (p, o, n, x) => {
8
8
  for (var e = void 0, i = p.length - 1, l; i >= 0; i--)
@@ -53,7 +53,7 @@ const t = class u extends h {
53
53
  font: var(--font-normal-small);
54
54
  background: transparent;
55
55
  border: none;
56
- border-radius: 5px;
56
+ border-radius: calc(5px * var(--radius-scale, 1));
57
57
  cursor: pointer;
58
58
  transition:
59
59
  color var(--duration-instant),
@@ -114,10 +114,10 @@ const t = class u extends h {
114
114
  }
115
115
  render() {
116
116
  const o = !!this.language || this.copy;
117
- return d`<div part="base" class=${o ? "base" : "base bare"}>
118
- ${o ? d`<div part="header" class="header">
117
+ return c`<div part="base" class=${o ? "base" : "base bare"}>
118
+ ${o ? c`<div part="header" class="header">
119
119
  <span class="language">${this.language}</span>
120
- ${this.copy ? d`<button
120
+ ${this.copy ? c`<button
121
121
  type="button"
122
122
  class=${this.copied ? "copy copied" : "copy"}
123
123
  aria-label=${this.copied ? r().copied : r().copyCode}
@@ -137,19 +137,19 @@ const t = class u extends h {
137
137
  }
138
138
  };
139
139
  a([
140
- m()
140
+ v()
141
141
  ], t.prototype, "copied");
142
142
  a([
143
- c({ type: String })
143
+ d({ type: String })
144
144
  ], t.prototype, "language");
145
145
  a([
146
- c({ type: Boolean })
146
+ d({ type: Boolean })
147
147
  ], t.prototype, "copy");
148
148
  a([
149
- c({ type: String })
149
+ d({ type: String })
150
150
  ], t.prototype, "label");
151
151
  let f = t;
152
- v("kt-code", f);
152
+ m("kt-code", f);
153
153
  export {
154
154
  f as KtCode
155
155
  };
@@ -1 +1 @@
1
- {"version":3,"file":"kt-code.js","sources":["../../../../src/components/core/kt-code/kt-code.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport { strings } from '#internal/strings';\nimport '../kt-icon/kt-icon.js';\n\n/**\n * A block of code on a recessed surface, with its language and a copy button.\n *\n * The element owns the chrome — surface, label, scrolling, copy — and nothing\n * else. **Highlighting is the caller's**: slot in whatever markup a highlighter\n * produced, or plain text for none. A design system that bundled a syntax\n * highlighter would be picking your bundle size and your language set for you.\n *\n * ```html\n * <kt-code language=\"js\">const total = items.length;</kt-code>\n *\n * <kt-code language=\"ts\" copy>\n * <span class=\"hljs-keyword\">const</span> total = items.length;\n * </kt-code>\n * ```\n *\n * For a token or an identifier inside a sentence, reach for\n * `<kt-badge variant=\"code\">` instead — this is for blocks.\n *\n * @element kt-code\n *\n * @slot - The code. Plain text, or a highlighter's markup.\n *\n * @csspart base - The container.\n * @csspart header - The language row.\n * @csspart pre - The scrolling `<pre>`.\n *\n * @fires kt-copy - The copy button was pressed. `detail: { code }`.\n */\nexport class KtCode extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n .base {\n overflow: hidden;\n background: var(--surface-code);\n border: var(--border-width) solid var(--border-code);\n border-radius: var(--border-radius);\n }\n\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--gap-button);\n padding: 6px 8px 6px 14px;\n border-bottom: var(--border-width) solid var(--border-code);\n }\n\n .language {\n color: var(--text-muted);\n font: var(--font-normal-small);\n letter-spacing: 1px;\n text-transform: uppercase;\n }\n\n .copy {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n color: var(--text-muted);\n font: var(--font-normal-small);\n background: transparent;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n transition:\n color var(--duration-instant),\n background-color var(--duration-instant);\n }\n\n .copy:hover {\n color: var(--text-body);\n background: var(--surface-raised);\n }\n\n .copy:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 1px;\n }\n\n .copied {\n color: var(--color-success-text);\n }\n\n pre {\n margin: 0;\n padding: 14px;\n overflow-x: auto;\n scrollbar-width: thin;\n }\n\n code {\n font: var(--font-code-regular);\n color: var(--text-code);\n }\n\n /* A block with no header should not leave a stray rule behind. */\n .bare pre {\n padding-top: 14px;\n }\n `,\n ];\n\n /** How long the copy button stays in its confirmed state. */\n private static readonly COPIED_MS = 1600;\n\n private copiedTimer: ReturnType<typeof setTimeout> | undefined;\n\n @state()\n private copied = false;\n\n /** Language label, shown uppercase. Purely informative. */\n @property({ type: String })\n language = '';\n\n /** Shows the copy button. */\n @property({ type: Boolean })\n copy = false;\n\n /** Accessible name for the block, when the language alone is not enough. */\n @property({ type: String })\n label = '';\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.copiedTimer !== undefined) clearTimeout(this.copiedTimer);\n }\n\n /** The code as plain text, whatever markup it is wrapped in. */\n get code(): string {\n return (this.textContent ?? '').replace(/^\\n+|\\n+$/g, '');\n }\n\n private async copyToClipboard(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.code);\n this.copied = true;\n\n if (this.copiedTimer !== undefined) clearTimeout(this.copiedTimer);\n this.copiedTimer = setTimeout(() => {\n this.copied = false;\n }, KtCode.COPIED_MS);\n } catch {\n // Denied permission, or an insecure origin. Nothing useful to show, and\n // failing loudly over a convenience button helps no one.\n }\n emit(this, 'kt-copy', { code: this.code });\n }\n\n override render(): TemplateResult {\n const hasHeader = Boolean(this.language) || this.copy;\n\n return html`<div part=\"base\" class=${hasHeader ? 'base' : 'base bare'}>\n ${\n hasHeader\n ? html`<div part=\"header\" class=\"header\">\n <span class=\"language\">${this.language}</span>\n ${\n this.copy\n ? html`<button\n type=\"button\"\n class=${this.copied ? 'copy copied' : 'copy'}\n aria-label=${this.copied ? strings().copied : strings().copyCode}\n @click=${this.copyToClipboard}\n >\n <kt-icon name=${this.copied ? 'check' : 'copy'} size=\"14\"></kt-icon>\n ${this.copied ? strings().copied : strings().copy}\n </button>`\n : nothing\n }\n </div>`\n : nothing\n }\n\n <pre\n part=\"pre\"\n tabindex=\"0\"\n aria-label=${this.label || nothing}\n ><code><slot></slot></code></pre>\n </div>`;\n }\n}\n\ndefineElement('kt-code', KtCode);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-code': KtCode;\n }\n}\n"],"names":["_KtCode","KtElement","css","emit","hasHeader","html","strings","nothing","__decorateClass","state","property","KtCode","defineElement"],"mappings":";;;;;;;;;;;AAoCO,MAAMA,IAAN,MAAMA,UAAeC,EAAU;AAAA,EAA/B,cAAA;AAAA,UAAA,GAAA,SAAA,GAsFL,KAAQ,SAAS,IAIjB,KAAA,WAAW,IAIX,KAAA,OAAO,IAIP,KAAA,QAAQ;AAAA,EAAA;AAAA,EAjGR,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBA,EAAU;AAAA,MACVC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EA2EF;AAAA,EAGA,OAAA;AAAA,SAAwB,YAAY;AAAA,EAAA;AAAA,EAmB3B,uBAA6B;AACpC,UAAM,qBAAA,GACF,KAAK,gBAAgB,UAAW,aAAa,KAAK,WAAW;AAAA,EACnE;AAAA;AAAA,EAGA,IAAI,OAAe;AACjB,YAAQ,KAAK,eAAe,IAAI,QAAQ,cAAc,EAAE;AAAA,EAC1D;AAAA,EAEA,MAAc,kBAAiC;AAC7C,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,KAAK,IAAI,GAC7C,KAAK,SAAS,IAEV,KAAK,gBAAgB,UAAW,aAAa,KAAK,WAAW,GACjE,KAAK,cAAc,WAAW,MAAM;AAClC,aAAK,SAAS;AAAA,MAChB,GAAGF,EAAO,SAAS;AAAA,IACrB,QAAQ;AAAA,IAGR;AACA,IAAAG,EAAK,MAAM,WAAW,EAAE,MAAM,KAAK,MAAM;AAAA,EAC3C;AAAA,EAES,SAAyB;AAChC,UAAMC,IAAY,EAAQ,KAAK,YAAa,KAAK;AAEjD,WAAOC,2BAA8BD,IAAY,SAAS,WAAW;AAAA,QAEjEA,IACIC;AAAA,uCAC2B,KAAK,QAAQ;AAAA,gBAEpC,KAAK,OACDA;AAAA;AAAA,8BAEU,KAAK,SAAS,gBAAgB,MAAM;AAAA,mCAC/B,KAAK,SAASC,EAAA,EAAU,SAASA,EAAA,EAAU,QAAQ;AAAA,+BACvD,KAAK,eAAe;AAAA;AAAA,sCAEb,KAAK,SAAS,UAAU,MAAM;AAAA,wBAC5C,KAAK,SAASA,EAAA,EAAU,SAASA,EAAA,EAAU,IAAI;AAAA,iCAEnDC,CACN;AAAA,sBAEFA,CACN;AAAA;AAAA;AAAA;AAAA;AAAA,qBAKe,KAAK,SAASA,CAAO;AAAA;AAAA;AAAA,EAGxC;AACF;AAxEUC,EAAA;AAAA,EADPC,EAAA;AAAM,GArFIT,EAsFH,WAAA,QAAA;AAIRQ,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAzFfV,EA0FX,WAAA,UAAA;AAIAQ,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,QAAA,CAAS;AAAA,GA7FhBV,EA8FX,WAAA,MAAA;AAIAQ,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAjGfV,EAkGX,WAAA,OAAA;AAlGK,IAAMW,IAANX;AAgKPY,EAAc,WAAWD,CAAM;"}
1
+ {"version":3,"file":"kt-code.js","sources":["../../../../src/components/core/kt-code/kt-code.ts"],"sourcesContent":["import { css, html, nothing, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\nimport { emit } from '#internal/events';\nimport { strings } from '#internal/strings';\nimport '../kt-icon/kt-icon.js';\n\n/**\n * A block of code on a recessed surface, with its language and a copy button.\n *\n * The element owns the chrome — surface, label, scrolling, copy — and nothing\n * else. **Highlighting is the caller's**: slot in whatever markup a highlighter\n * produced, or plain text for none. A design system that bundled a syntax\n * highlighter would be picking your bundle size and your language set for you.\n *\n * ```html\n * <kt-code language=\"js\">const total = items.length;</kt-code>\n *\n * <kt-code language=\"ts\" copy>\n * <span class=\"hljs-keyword\">const</span> total = items.length;\n * </kt-code>\n * ```\n *\n * For a token or an identifier inside a sentence, reach for\n * `<kt-badge variant=\"code\">` instead — this is for blocks.\n *\n * @element kt-code\n *\n * @slot - The code. Plain text, or a highlighter's markup.\n *\n * @csspart base - The container.\n * @csspart header - The language row.\n * @csspart pre - The scrolling `<pre>`.\n *\n * @fires kt-copy - The copy button was pressed. `detail: { code }`.\n */\nexport class KtCode extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: block;\n }\n\n .base {\n overflow: hidden;\n background: var(--surface-code);\n border: var(--border-width) solid var(--border-code);\n border-radius: var(--border-radius);\n }\n\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--gap-button);\n padding: 6px 8px 6px 14px;\n border-bottom: var(--border-width) solid var(--border-code);\n }\n\n .language {\n color: var(--text-muted);\n font: var(--font-normal-small);\n letter-spacing: 1px;\n text-transform: uppercase;\n }\n\n .copy {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n color: var(--text-muted);\n font: var(--font-normal-small);\n background: transparent;\n border: none;\n border-radius: calc(5px * var(--radius-scale, 1));\n cursor: pointer;\n transition:\n color var(--duration-instant),\n background-color var(--duration-instant);\n }\n\n .copy:hover {\n color: var(--text-body);\n background: var(--surface-raised);\n }\n\n .copy:focus-visible {\n outline: var(--outline-width) solid var(--color-primary-base);\n outline-offset: 1px;\n }\n\n .copied {\n color: var(--color-success-text);\n }\n\n pre {\n margin: 0;\n padding: 14px;\n overflow-x: auto;\n scrollbar-width: thin;\n }\n\n code {\n font: var(--font-code-regular);\n color: var(--text-code);\n }\n\n /* A block with no header should not leave a stray rule behind. */\n .bare pre {\n padding-top: 14px;\n }\n `,\n ];\n\n /** How long the copy button stays in its confirmed state. */\n private static readonly COPIED_MS = 1600;\n\n private copiedTimer: ReturnType<typeof setTimeout> | undefined;\n\n @state()\n private copied = false;\n\n /** Language label, shown uppercase. Purely informative. */\n @property({ type: String })\n language = '';\n\n /** Shows the copy button. */\n @property({ type: Boolean })\n copy = false;\n\n /** Accessible name for the block, when the language alone is not enough. */\n @property({ type: String })\n label = '';\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.copiedTimer !== undefined) clearTimeout(this.copiedTimer);\n }\n\n /** The code as plain text, whatever markup it is wrapped in. */\n get code(): string {\n return (this.textContent ?? '').replace(/^\\n+|\\n+$/g, '');\n }\n\n private async copyToClipboard(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.code);\n this.copied = true;\n\n if (this.copiedTimer !== undefined) clearTimeout(this.copiedTimer);\n this.copiedTimer = setTimeout(() => {\n this.copied = false;\n }, KtCode.COPIED_MS);\n } catch {\n // Denied permission, or an insecure origin. Nothing useful to show, and\n // failing loudly over a convenience button helps no one.\n }\n emit(this, 'kt-copy', { code: this.code });\n }\n\n override render(): TemplateResult {\n const hasHeader = Boolean(this.language) || this.copy;\n\n return html`<div part=\"base\" class=${hasHeader ? 'base' : 'base bare'}>\n ${\n hasHeader\n ? html`<div part=\"header\" class=\"header\">\n <span class=\"language\">${this.language}</span>\n ${\n this.copy\n ? html`<button\n type=\"button\"\n class=${this.copied ? 'copy copied' : 'copy'}\n aria-label=${this.copied ? strings().copied : strings().copyCode}\n @click=${this.copyToClipboard}\n >\n <kt-icon name=${this.copied ? 'check' : 'copy'} size=\"14\"></kt-icon>\n ${this.copied ? strings().copied : strings().copy}\n </button>`\n : nothing\n }\n </div>`\n : nothing\n }\n\n <pre\n part=\"pre\"\n tabindex=\"0\"\n aria-label=${this.label || nothing}\n ><code><slot></slot></code></pre>\n </div>`;\n }\n}\n\ndefineElement('kt-code', KtCode);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-code': KtCode;\n }\n}\n"],"names":["_KtCode","KtElement","css","emit","hasHeader","html","strings","nothing","__decorateClass","state","property","KtCode","defineElement"],"mappings":";;;;;;;;;;;AAoCO,MAAMA,IAAN,MAAMA,UAAeC,EAAU;AAAA,EAA/B,cAAA;AAAA,UAAA,GAAA,SAAA,GAsFL,KAAQ,SAAS,IAIjB,KAAA,WAAW,IAIX,KAAA,OAAO,IAIP,KAAA,QAAQ;AAAA,EAAA;AAAA,EAjGR,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBA,EAAU;AAAA,MACVC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EA2EF;AAAA,EAGA,OAAA;AAAA,SAAwB,YAAY;AAAA,EAAA;AAAA,EAmB3B,uBAA6B;AACpC,UAAM,qBAAA,GACF,KAAK,gBAAgB,UAAW,aAAa,KAAK,WAAW;AAAA,EACnE;AAAA;AAAA,EAGA,IAAI,OAAe;AACjB,YAAQ,KAAK,eAAe,IAAI,QAAQ,cAAc,EAAE;AAAA,EAC1D;AAAA,EAEA,MAAc,kBAAiC;AAC7C,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,KAAK,IAAI,GAC7C,KAAK,SAAS,IAEV,KAAK,gBAAgB,UAAW,aAAa,KAAK,WAAW,GACjE,KAAK,cAAc,WAAW,MAAM;AAClC,aAAK,SAAS;AAAA,MAChB,GAAGF,EAAO,SAAS;AAAA,IACrB,QAAQ;AAAA,IAGR;AACA,IAAAG,EAAK,MAAM,WAAW,EAAE,MAAM,KAAK,MAAM;AAAA,EAC3C;AAAA,EAES,SAAyB;AAChC,UAAMC,IAAY,EAAQ,KAAK,YAAa,KAAK;AAEjD,WAAOC,2BAA8BD,IAAY,SAAS,WAAW;AAAA,QAEjEA,IACIC;AAAA,uCAC2B,KAAK,QAAQ;AAAA,gBAEpC,KAAK,OACDA;AAAA;AAAA,8BAEU,KAAK,SAAS,gBAAgB,MAAM;AAAA,mCAC/B,KAAK,SAASC,EAAA,EAAU,SAASA,EAAA,EAAU,QAAQ;AAAA,+BACvD,KAAK,eAAe;AAAA;AAAA,sCAEb,KAAK,SAAS,UAAU,MAAM;AAAA,wBAC5C,KAAK,SAASA,EAAA,EAAU,SAASA,EAAA,EAAU,IAAI;AAAA,iCAEnDC,CACN;AAAA,sBAEFA,CACN;AAAA;AAAA;AAAA;AAAA;AAAA,qBAKe,KAAK,SAASA,CAAO;AAAA;AAAA;AAAA,EAGxC;AACF;AAxEUC,EAAA;AAAA,EADPC,EAAA;AAAM,GArFIT,EAsFH,WAAA,QAAA;AAIRQ,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAzFfV,EA0FX,WAAA,UAAA;AAIAQ,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,QAAA,CAAS;AAAA,GA7FhBV,EA8FX,WAAA,MAAA;AAIAQ,EAAA;AAAA,EADCE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAjGfV,EAkGX,WAAA,OAAA;AAlGK,IAAMW,IAANX;AAgKPY,EAAc,WAAWD,CAAM;"}
@@ -1,6 +1,6 @@
1
1
  import { css as f, html as c, nothing as l } from "lit";
2
2
  import { property as n } from "lit/decorators.js";
3
- import { K as m, d as u } from "../../../chunks/kt-element-Djx2JcGl.js";
3
+ import { K as m, d as u } from "../../../chunks/kt-element-T0VbIBNp.js";
4
4
  import { g as v } from "../../../chunks/defaults-CFrjqae2.js";
5
5
  var w = Object.defineProperty, o = (i, e, r, h) => {
6
6
  for (var t = void 0, a = i.length - 1, d; a >= 0; a--)
@@ -1,7 +1,7 @@
1
1
  import { css as c, html as i } from "lit";
2
2
  import { property as p } from "lit/decorators.js";
3
- import { K as l, d as m } from "../../../chunks/kt-element-Djx2JcGl.js";
4
- var f = Object.defineProperty, d = (a, t, e, u) => {
3
+ import { K as l, d as m } from "../../../chunks/kt-element-T0VbIBNp.js";
4
+ var f = Object.defineProperty, d = (a, t, e, h) => {
5
5
  for (var r = void 0, s = a.length - 1, o; s >= 0; s--)
6
6
  (o = a[s]) && (r = o(t, e, r) || r);
7
7
  return r && f(t, e, r), r;
@@ -17,7 +17,7 @@ const b = {
17
17
  enter: "↵",
18
18
  escape: "esc",
19
19
  backspace: "⌫"
20
- }, h = {
20
+ }, u = {
21
21
  mod: "Ctrl",
22
22
  meta: "Win",
23
23
  cmd: "Ctrl",
@@ -56,7 +56,7 @@ class n extends l {
56
56
  font-family: var(--font-family-body);
57
57
  background: var(--surface-card);
58
58
  border: var(--border-width) solid var(--border-subtle);
59
- border-radius: 5px;
59
+ border-radius: calc(5px * var(--radius-scale, 1));
60
60
  }
61
61
  `
62
62
  ];
@@ -66,7 +66,7 @@ class n extends l {
66
66
  }
67
67
  /** The keys as they will be shown. Exposed so tests and docs can read them. */
68
68
  get labels() {
69
- const t = this.isMac ? b : h;
69
+ const t = this.isMac ? b : u;
70
70
  return this.keys.split(/\s+/).filter(Boolean).map((e) => t[e.toLowerCase()] ?? e.toUpperCase());
71
71
  }
72
72
  render() {
@@ -1 +1 @@
1
- {"version":3,"file":"kt-kbd.js","sources":["../../../../src/components/core/kt-kbd/kt-kbd.ts"],"sourcesContent":["import { css, html, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\n\n/**\n * Symbols people actually recognise, per platform.\n *\n * `mod` is the one to reach for: it means \"the primary shortcut modifier\",\n * which is Command on a Mac and Control everywhere else. `meta` stays honest —\n * on Windows the Meta key really is the Windows key, and printing \"Ctrl\" for it\n * would send the reader to the wrong key.\n */\nconst MAC: Record<string, string> = {\n mod: '⌘',\n meta: '⌘',\n cmd: '⌘',\n ctrl: '⌃',\n alt: '⌥',\n option: '⌥',\n shift: '⇧',\n enter: '↵',\n escape: 'esc',\n backspace: '⌫',\n};\n\nconst OTHER: Record<string, string> = {\n mod: 'Ctrl',\n meta: 'Win',\n cmd: 'Ctrl',\n ctrl: 'Ctrl',\n alt: 'Alt',\n option: 'Alt',\n shift: 'Shift',\n enter: 'Enter',\n escape: 'Esc',\n backspace: 'Backspace',\n};\n\n/**\n * A keyboard shortcut.\n *\n * Renders per platform: `⌘ K` on a Mac, `Ctrl K` elsewhere. A shortcut printed\n * with the wrong modifier is worse than none — the reader tries it, it does not\n * work, and they stop trusting the hints.\n *\n * @element kt-kbd\n *\n * @slot - The key, when `keys` is not used.\n *\n * @csspart base - The wrapper.\n * @csspart key - One key.\n *\n * @example\n * ```html\n * <kt-kbd keys=\"meta k\"></kt-kbd>\n * <kt-kbd>/</kt-kbd>\n * ```\n */\nexport class KtKbd extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n vertical-align: middle;\n }\n\n kbd {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 5px;\n color: var(--text-muted);\n font: var(--font-normal-small);\n font-family: var(--font-family-body);\n background: var(--surface-card);\n border: var(--border-width) solid var(--border-subtle);\n border-radius: 5px;\n }\n `,\n ];\n\n /** Space-separated keys: `meta k`, `ctrl shift p`. */\n @property({ type: String })\n keys = '';\n\n /** Forces a platform instead of sniffing the current one. */\n @property({ type: String })\n platform: 'auto' | 'mac' | 'other' = 'auto';\n\n private get isMac(): boolean {\n if (this.platform !== 'auto') return this.platform === 'mac';\n if (typeof navigator === 'undefined') return false;\n return /mac|iphone|ipad/i.test(navigator.platform || navigator.userAgent);\n }\n\n /** The keys as they will be shown. Exposed so tests and docs can read them. */\n get labels(): string[] {\n const table = this.isMac ? MAC : OTHER;\n return this.keys\n .split(/\\s+/)\n .filter(Boolean)\n .map((key) => table[key.toLowerCase()] ?? key.toUpperCase());\n }\n\n override render(): TemplateResult {\n const labels = this.labels;\n\n return html`<span part=\"base\" style=\"display:contents\">\n ${\n labels.length > 0\n ? labels.map((label) => html`<kbd part=\"key\">${label}</kbd>`)\n : html`<kbd part=\"key\"><slot></slot></kbd>`\n }\n </span>`;\n }\n}\n\ndefineElement('kt-kbd', KtKbd);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-kbd': KtKbd;\n }\n}\n"],"names":["MAC","OTHER","KtKbd","KtElement","css","table","key","labels","html","label","__decorateClass","property","defineElement"],"mappings":";;;;;;;;AAYA,MAAMA,IAA8B;AAAA,EAClC,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AACb,GAEMC,IAAgC;AAAA,EACpC,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AACb;AAsBO,MAAMC,UAAcC,EAAU;AAAA,EAA9B,cAAA;AAAA,UAAA,GAAA,SAAA,GA8BL,KAAA,OAAO,IAIP,KAAA,WAAqC;AAAA,EAAA;AAAA,EAjCrC,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBA,EAAU;AAAA,MACVC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAuBF;AAAA,EAUA,IAAY,QAAiB;AAC3B,WAAI,KAAK,aAAa,SAAe,KAAK,aAAa,QACnD,OAAO,YAAc,MAAoB,KACtC,mBAAmB,KAAK,UAAU,YAAY,UAAU,SAAS;AAAA,EAC1E;AAAA;AAAA,EAGA,IAAI,SAAmB;AACrB,UAAMC,IAAQ,KAAK,QAAQL,IAAMC;AACjC,WAAO,KAAK,KACT,MAAM,KAAK,EACX,OAAO,OAAO,EACd,IAAI,CAACK,MAAQD,EAAMC,EAAI,YAAA,CAAa,KAAKA,EAAI,aAAa;AAAA,EAC/D;AAAA,EAES,SAAyB;AAChC,UAAMC,IAAS,KAAK;AAEpB,WAAOC;AAAA,QAEHD,EAAO,SAAS,IACZA,EAAO,IAAI,CAACE,MAAUD,oBAAuBC,CAAK,QAAQ,IAC1DD,sCACN;AAAA;AAAA,EAEJ;AACF;AAhCEE,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA7BfT,EA8BX,WAAA,MAAA;AAIAQ,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAjCfT,EAkCX,WAAA,UAAA;AA8BFU,EAAc,UAAUV,CAAK;"}
1
+ {"version":3,"file":"kt-kbd.js","sources":["../../../../src/components/core/kt-kbd/kt-kbd.ts"],"sourcesContent":["import { css, html, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { KtElement, defineElement } from '#internal/kt-element';\n\n/**\n * Symbols people actually recognise, per platform.\n *\n * `mod` is the one to reach for: it means \"the primary shortcut modifier\",\n * which is Command on a Mac and Control everywhere else. `meta` stays honest —\n * on Windows the Meta key really is the Windows key, and printing \"Ctrl\" for it\n * would send the reader to the wrong key.\n */\nconst MAC: Record<string, string> = {\n mod: '⌘',\n meta: '⌘',\n cmd: '⌘',\n ctrl: '⌃',\n alt: '⌥',\n option: '⌥',\n shift: '⇧',\n enter: '↵',\n escape: 'esc',\n backspace: '⌫',\n};\n\nconst OTHER: Record<string, string> = {\n mod: 'Ctrl',\n meta: 'Win',\n cmd: 'Ctrl',\n ctrl: 'Ctrl',\n alt: 'Alt',\n option: 'Alt',\n shift: 'Shift',\n enter: 'Enter',\n escape: 'Esc',\n backspace: 'Backspace',\n};\n\n/**\n * A keyboard shortcut.\n *\n * Renders per platform: `⌘ K` on a Mac, `Ctrl K` elsewhere. A shortcut printed\n * with the wrong modifier is worse than none — the reader tries it, it does not\n * work, and they stop trusting the hints.\n *\n * @element kt-kbd\n *\n * @slot - The key, when `keys` is not used.\n *\n * @csspart base - The wrapper.\n * @csspart key - One key.\n *\n * @example\n * ```html\n * <kt-kbd keys=\"meta k\"></kt-kbd>\n * <kt-kbd>/</kt-kbd>\n * ```\n */\nexport class KtKbd extends KtElement {\n static override styles = [\n KtElement.styles,\n css`\n :host {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n vertical-align: middle;\n }\n\n kbd {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 5px;\n color: var(--text-muted);\n font: var(--font-normal-small);\n font-family: var(--font-family-body);\n background: var(--surface-card);\n border: var(--border-width) solid var(--border-subtle);\n border-radius: calc(5px * var(--radius-scale, 1));\n }\n `,\n ];\n\n /** Space-separated keys: `meta k`, `ctrl shift p`. */\n @property({ type: String })\n keys = '';\n\n /** Forces a platform instead of sniffing the current one. */\n @property({ type: String })\n platform: 'auto' | 'mac' | 'other' = 'auto';\n\n private get isMac(): boolean {\n if (this.platform !== 'auto') return this.platform === 'mac';\n if (typeof navigator === 'undefined') return false;\n return /mac|iphone|ipad/i.test(navigator.platform || navigator.userAgent);\n }\n\n /** The keys as they will be shown. Exposed so tests and docs can read them. */\n get labels(): string[] {\n const table = this.isMac ? MAC : OTHER;\n return this.keys\n .split(/\\s+/)\n .filter(Boolean)\n .map((key) => table[key.toLowerCase()] ?? key.toUpperCase());\n }\n\n override render(): TemplateResult {\n const labels = this.labels;\n\n return html`<span part=\"base\" style=\"display:contents\">\n ${\n labels.length > 0\n ? labels.map((label) => html`<kbd part=\"key\">${label}</kbd>`)\n : html`<kbd part=\"key\"><slot></slot></kbd>`\n }\n </span>`;\n }\n}\n\ndefineElement('kt-kbd', KtKbd);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'kt-kbd': KtKbd;\n }\n}\n"],"names":["MAC","OTHER","KtKbd","KtElement","css","table","key","labels","html","label","__decorateClass","property","defineElement"],"mappings":";;;;;;;;AAYA,MAAMA,IAA8B;AAAA,EAClC,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AACb,GAEMC,IAAgC;AAAA,EACpC,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AACb;AAsBO,MAAMC,UAAcC,EAAU;AAAA,EAA9B,cAAA;AAAA,UAAA,GAAA,SAAA,GA8BL,KAAA,OAAO,IAIP,KAAA,WAAqC;AAAA,EAAA;AAAA,EAjCrC,OAAA;AAAA,SAAgB,SAAS;AAAA,MACvBA,EAAU;AAAA,MACVC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAuBF;AAAA,EAUA,IAAY,QAAiB;AAC3B,WAAI,KAAK,aAAa,SAAe,KAAK,aAAa,QACnD,OAAO,YAAc,MAAoB,KACtC,mBAAmB,KAAK,UAAU,YAAY,UAAU,SAAS;AAAA,EAC1E;AAAA;AAAA,EAGA,IAAI,SAAmB;AACrB,UAAMC,IAAQ,KAAK,QAAQL,IAAMC;AACjC,WAAO,KAAK,KACT,MAAM,KAAK,EACX,OAAO,OAAO,EACd,IAAI,CAACK,MAAQD,EAAMC,EAAI,YAAA,CAAa,KAAKA,EAAI,aAAa;AAAA,EAC/D;AAAA,EAES,SAAyB;AAChC,UAAMC,IAAS,KAAK;AAEpB,WAAOC;AAAA,QAEHD,EAAO,SAAS,IACZA,EAAO,IAAI,CAACE,MAAUD,oBAAuBC,CAAK,QAAQ,IAC1DD,sCACN;AAAA;AAAA,EAEJ;AACF;AAhCEE,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA7BfT,EA8BX,WAAA,MAAA;AAIAQ,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAjCfT,EAkCX,WAAA,UAAA;AA8BFU,EAAc,UAAUV,CAAK;"}
@@ -1,10 +1,10 @@
1
1
  import { css as g, nothing as p, html as a } from "lit";
2
2
  import { query as f, state as y, property as o } from "lit/decorators.js";
3
3
  import { classMap as w } from "lit/directives/class-map.js";
4
- import { K as h, d as x } from "../../../chunks/kt-element-Djx2JcGl.js";
4
+ import { K as h, d as x } from "../../../chunks/kt-element-T0VbIBNp.js";
5
5
  import { e as k } from "../../../chunks/events-r51msXNf.js";
6
- import { f as m, o as $, l as I, n as u } from "../../../chunks/listbox-llcUu_V-.js";
7
- import { s as v } from "../../../chunks/index-STEEvEP7.js";
6
+ import { f as m, o as $, l as I, n as u } from "../../../chunks/listbox-LsUEyGhQ.js";
7
+ import { s as v } from "../../../chunks/index-TWJzttLX.js";
8
8
  import "../kt-button/kt-button.js";
9
9
  import "../kt-icon/kt-icon.js";
10
10
  import "../../overlays/kt-dropdown/kt-dropdown.js";
@@ -1,9 +1,9 @@
1
1
  import { svg as b, nothing as A, css as vt, html as G } from "lit";
2
2
  import { query as kt, state as et, property as B } from "lit/decorators.js";
3
3
  import { classMap as wt } from "lit/directives/class-map.js";
4
- import { K as nt, d as Mt } from "../../../chunks/kt-element-Djx2JcGl.js";
4
+ import { K as nt, d as Mt } from "../../../chunks/kt-element-T0VbIBNp.js";
5
5
  import { u as At, e as lt } from "../../../chunks/events-r51msXNf.js";
6
- import { s as E } from "../../../chunks/index-STEEvEP7.js";
6
+ import { s as E } from "../../../chunks/index-TWJzttLX.js";
7
7
  function St(s) {
8
8
  const t = Math.floor(Math.log10(s)), e = s / 10 ** t;
9
9
  return (e < 1.5 ? 1 : e < 3 ? 2 : e < 7 ? 5 : 10) * 10 ** t;
@@ -773,7 +773,7 @@ class S extends nt {
773
773
  width: 8px;
774
774
  height: 8px;
775
775
  background: var(--swatch);
776
- border-radius: 2px;
776
+ border-radius: calc(2px * var(--radius-scale, 1));
777
777
  }
778
778
 
779
779
  .swatch.hollow {