@krollins/blueprint 0.1.11 → 0.1.13
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/dist/components/accordion.js +393 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert.js +213 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/avatar.js +237 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.js +144 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/breadcrumb.js +481 -0
- package/dist/components/breadcrumb.js.map +1 -0
- package/dist/components/button.js +192 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/card.js +223 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/checkbox.js +337 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/color-picker.js +1660 -0
- package/dist/components/color-picker.js.map +1 -0
- package/dist/components/combobox.js +595 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/date-picker.js +726 -0
- package/dist/components/date-picker.js.map +1 -0
- package/dist/components/divider.js +214 -0
- package/dist/components/divider.js.map +1 -0
- package/dist/components/drawer.js +568 -0
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/dropdown.js +377 -0
- package/dist/components/dropdown.js.map +1 -0
- package/dist/components/file-upload.js +669 -0
- package/dist/components/file-upload.js.map +1 -0
- package/dist/components/heading.js +161 -0
- package/dist/components/heading.js.map +1 -0
- package/dist/components/icon.js +599 -0
- package/dist/components/icon.js.map +1 -0
- package/dist/components/input.js +363 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/link.js +178 -0
- package/dist/components/link.js.map +1 -0
- package/dist/components/menu.js +331 -0
- package/dist/components/menu.js.map +1 -0
- package/dist/components/modal.js +317 -0
- package/dist/components/modal.js.map +1 -0
- package/dist/components/multi-select.js +642 -0
- package/dist/components/multi-select.js.map +1 -0
- package/dist/components/notification.js +429 -0
- package/dist/components/notification.js.map +1 -0
- package/dist/components/number-input.js +556 -0
- package/dist/components/number-input.js.map +1 -0
- package/dist/components/pagination.js +320 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/popover.js +597 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/progress.js +219 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/radio.js +321 -0
- package/dist/components/radio.js.map +1 -0
- package/dist/components/select.js +498 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/skeleton.js +240 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/slider.js +9 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/spinner.js +133 -0
- package/dist/components/spinner.js.map +1 -0
- package/dist/components/stepper.js +812 -0
- package/dist/components/stepper.js.map +1 -0
- package/dist/components/switch.js +380 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table.js +642 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.js +547 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/tag.js +291 -0
- package/dist/components/tag.js.map +1 -0
- package/dist/components/text.js +278 -0
- package/dist/components/text.js.map +1 -0
- package/dist/components/textarea.js +380 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/time-picker.js +457 -0
- package/dist/components/time-picker.js.map +1 -0
- package/dist/components/tooltip.js +239 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/tree.js +582 -0
- package/dist/components/tree.js.map +1 -0
- package/dist/index.js +93 -17799
- package/dist/index.js.map +1 -1
- package/dist/shared/boolean-converter-XDGfS9LC.js +12 -0
- package/dist/shared/boolean-converter-XDGfS9LC.js.map +1 -0
- package/dist/shared/debounce-BckY30Sf.js +23 -0
- package/dist/shared/debounce-BckY30Sf.js.map +1 -0
- package/dist/shared/memoize-DlOFy-92.js +16 -0
- package/dist/shared/memoize-DlOFy-92.js.map +1 -0
- package/dist/shared/slider-BNt5TITl.js +484 -0
- package/dist/shared/slider-BNt5TITl.js.map +1 -0
- package/package.json +49 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sources":["../../source/components/text/text.style.ts","../../source/components/text/text.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const textStyles = css`\n /* Base styles */\n :host {\n display: inline-block;\n }\n\n :host([as='span']) {\n display: inline;\n }\n\n .text {\n margin: 0;\n padding: 0;\n font-family: var(--bp-font-family);\n color: var(--bp-color-text);\n line-height: var(--bp-line-height-normal);\n }\n\n /* Sizes */\n .text--xs {\n font-size: var(--bp-font-size-xs);\n }\n\n .text--sm {\n font-size: var(--bp-font-size-sm);\n }\n\n .text--base {\n font-size: var(--bp-font-size-base);\n }\n\n .text--lg {\n font-size: var(--bp-font-size-lg);\n }\n\n .text--xl {\n font-size: var(--bp-font-size-xl);\n }\n\n /* Font weights */\n .text--light {\n font-weight: var(--bp-font-weight-light);\n }\n\n .text--normal {\n font-weight: var(--bp-font-weight-normal);\n }\n\n .text--medium {\n font-weight: var(--bp-font-weight-medium);\n }\n\n .text--semibold {\n font-weight: var(--bp-font-weight-semibold);\n }\n\n .text--bold {\n font-weight: var(--bp-font-weight-bold);\n }\n\n /* Variants */\n .text--default {\n color: var(--bp-color-text);\n }\n\n .text--muted {\n color: var(--bp-color-text-muted);\n }\n\n .text--primary {\n color: var(--bp-color-primary);\n }\n\n .text--success {\n color: var(--bp-color-success);\n }\n\n .text--warning {\n color: var(--bp-color-warning);\n }\n\n .text--error {\n color: var(--bp-color-error);\n }\n\n /* Alignment */\n .text--align-left {\n text-align: left;\n }\n\n .text--align-center {\n text-align: center;\n }\n\n .text--align-right {\n text-align: right;\n }\n\n .text--align-justify {\n text-align: justify;\n }\n\n /* Text transform */\n .text--transform-uppercase {\n text-transform: uppercase;\n }\n\n .text--transform-lowercase {\n text-transform: lowercase;\n }\n\n .text--transform-capitalize {\n text-transform: capitalize;\n }\n\n /* Letter spacing (tracking) */\n .text--tracking-tighter {\n letter-spacing: -0.05em;\n }\n\n .text--tracking-tight {\n letter-spacing: -0.025em;\n }\n\n .text--tracking-wide {\n letter-spacing: 0.025em;\n }\n\n .text--tracking-wider {\n letter-spacing: 0.05em;\n }\n\n /* Line height variants */\n .text--line-height-none {\n line-height: var(--bp-line-height-none);\n }\n\n .text--line-height-tight {\n line-height: var(--bp-line-height-tight);\n }\n\n .text--line-height-snug {\n line-height: var(--bp-line-height-snug);\n }\n\n .text--line-height-relaxed {\n line-height: var(--bp-line-height-relaxed);\n }\n\n .text--line-height-loose {\n line-height: var(--bp-line-height-loose);\n }\n\n /* Multi-line clamp */\n .text--clamp-1,\n .text--clamp-2,\n .text--clamp-3,\n .text--clamp-4,\n .text--clamp-5,\n .text--clamp-6 {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .text--clamp-1 {\n -webkit-line-clamp: 1;\n }\n\n .text--clamp-2 {\n -webkit-line-clamp: 2;\n }\n\n .text--clamp-3 {\n -webkit-line-clamp: 3;\n }\n\n .text--clamp-4 {\n -webkit-line-clamp: 4;\n }\n\n .text--clamp-5 {\n -webkit-line-clamp: 5;\n }\n\n .text--clamp-6 {\n -webkit-line-clamp: 6;\n }\n\n /* States */\n .text--italic {\n font-style: italic;\n }\n\n .text--truncate {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 100%;\n }\n`;\n","import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { textStyles } from './text.style.js';\n\nexport type TextElement = 'p' | 'span' | 'div';\nexport type TextSize = 'xs' | 'sm' | 'base' | 'lg' | 'xl';\nexport type TextWeight = 'light' | 'normal' | 'medium' | 'semibold' | 'bold';\nexport type TextVariant =\n | 'default'\n | 'muted'\n | 'primary'\n | 'success'\n | 'warning'\n | 'error';\nexport type TextAlign = 'left' | 'center' | 'right' | 'justify';\nexport type TextTransform = 'none' | 'uppercase' | 'lowercase' | 'capitalize';\nexport type TextTracking = 'tighter' | 'tight' | 'normal' | 'wide' | 'wider';\nexport type TextLineHeight =\n | 'none'\n | 'tight'\n | 'snug'\n | 'normal'\n | 'relaxed'\n | 'loose';\n\n/**\n * A typography component for body text with flexible styling options.\n *\n * @element bp-text\n *\n * @property {TextElement} as - The HTML element type to render\n * @property {TextSize} size - The size of the text\n * @property {TextWeight} weight - The font weight\n * @property {TextVariant} variant - The color variant\n * @property {TextAlign} align - Text alignment\n * @property {TextTransform} transform - Text transformation (uppercase, lowercase, capitalize)\n * @property {TextTracking} tracking - Letter spacing\n * @property {TextLineHeight} lineHeight - Line height variant\n * @property {number} clamp - Number of lines to clamp (multi-line truncation)\n * @property {boolean} italic - Whether the text is italic\n * @property {boolean} truncate - Whether to truncate with ellipsis\n *\n * @slot - The text content\n *\n * @csspart text - The text container element\n */\n@customElement('bp-text')\nexport class BpText extends LitElement {\n /**\n * The element type to render.\n */\n @property({ type: String, reflect: true }) declare as: TextElement;\n\n /**\n * The size of the text.\n */\n @property({ type: String, reflect: true }) declare size: TextSize;\n\n /**\n * The font weight of the text.\n */\n @property({ type: String, reflect: true }) declare weight: TextWeight;\n\n /**\n * The color variant of the text.\n */\n @property({ type: String, reflect: true }) declare variant: TextVariant;\n\n /**\n * The text alignment.\n */\n @property({ type: String, reflect: true }) declare align: TextAlign;\n\n /**\n * Text transformation.\n */\n @property({ type: String, reflect: true }) declare transform: TextTransform;\n\n /**\n * Letter spacing (tracking).\n */\n @property({ type: String, reflect: true }) declare tracking: TextTracking;\n\n /**\n * Line height variant.\n */\n @property({ type: String, reflect: true, attribute: 'line-height' })\n declare lineHeight: TextLineHeight;\n\n /**\n * Number of lines to clamp (multi-line truncation).\n * When set, text will be truncated to the specified number of lines.\n */\n @property({ type: Number, reflect: true }) declare clamp: number;\n\n /**\n * Whether the text should be italic.\n */\n @property({ type: Boolean, reflect: true }) declare italic: boolean;\n\n /**\n * Whether the text should be truncated with ellipsis.\n */\n @property({ type: Boolean, reflect: true }) declare truncate: boolean;\n\n static styles = [textStyles];\n\n constructor() {\n super();\n this.as = 'p';\n this.size = 'base';\n this.weight = 'normal';\n this.variant = 'default';\n this.align = 'left';\n this.transform = 'none';\n this.tracking = 'normal';\n this.lineHeight = 'normal';\n this.clamp = 0;\n this.italic = false;\n this.truncate = false;\n }\n\n render() {\n const classes = [\n 'text',\n `text--${this.size}`,\n `text--${this.weight}`,\n `text--${this.variant}`,\n `text--align-${this.align}`,\n this.transform !== 'none' ? `text--transform-${this.transform}` : '',\n this.tracking !== 'normal' ? `text--tracking-${this.tracking}` : '',\n this.lineHeight !== 'normal'\n ? `text--line-height-${this.lineHeight}`\n : '',\n this.clamp > 0 ? `text--clamp-${this.clamp}` : '',\n this.italic ? 'text--italic' : '',\n this.truncate ? 'text--truncate' : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n // Render the appropriate element based on 'as' prop\n switch (this.as) {\n case 'span':\n return html`<span part=\"text\" class=\"${classes}\"><slot></slot></span>`;\n case 'div':\n return html`<div part=\"text\" class=\"${classes}\"><slot></slot></div>`;\n case 'p':\n default:\n return html`<p part=\"text\" class=\"${classes}\"><slot></slot></p>`;\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'bp-text': BpText;\n }\n}\n"],"names":["textStyles","css","BpText","LitElement","classes","html","__decorateClass","property","customElement"],"mappings":"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"}
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
import { css as u, LitElement as d, nothing as h, html as l } from "lit";
|
|
2
|
+
import { property as a, query as f, customElement as v } from "lit/decorators.js";
|
|
3
|
+
import { ifDefined as s } from "lit/directives/if-defined.js";
|
|
4
|
+
import { live as m } from "lit/directives/live.js";
|
|
5
|
+
import { d as x } from "../shared/debounce-BckY30Sf.js";
|
|
6
|
+
import { b as g } from "../shared/boolean-converter-XDGfS9LC.js";
|
|
7
|
+
const y = u`
|
|
8
|
+
/* Base styles */
|
|
9
|
+
:host {
|
|
10
|
+
display: block;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.textarea-wrapper {
|
|
14
|
+
display: flex;
|
|
15
|
+
flex-direction: column;
|
|
16
|
+
gap: var(--bp-spacing-xs);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.textarea-label {
|
|
20
|
+
font-family: var(--bp-font-family);
|
|
21
|
+
font-size: var(--bp-font-size-sm);
|
|
22
|
+
font-weight: var(--bp-font-weight-medium);
|
|
23
|
+
color: var(--bp-color-text);
|
|
24
|
+
line-height: var(--bp-line-height-normal);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.textarea-required {
|
|
28
|
+
color: var(--bp-color-error);
|
|
29
|
+
margin-left: var(--bp-spacing-xs);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.textarea {
|
|
33
|
+
font-family: var(--bp-font-family);
|
|
34
|
+
font-size: var(--bp-font-size-base);
|
|
35
|
+
line-height: var(--bp-line-height-normal);
|
|
36
|
+
color: var(--bp-color-text);
|
|
37
|
+
background-color: var(--bp-color-background);
|
|
38
|
+
border: var(--bp-border-width) solid var(--bp-color-border);
|
|
39
|
+
border-radius: var(--bp-border-radius-md);
|
|
40
|
+
padding: var(--bp-spacing-sm) var(--bp-spacing-md);
|
|
41
|
+
box-shadow: inset 0 1px 2px oklch(0 0 0 / 0.05);
|
|
42
|
+
transition:
|
|
43
|
+
border-color var(--bp-transition-fast),
|
|
44
|
+
box-shadow var(--bp-transition-fast);
|
|
45
|
+
width: 100%;
|
|
46
|
+
box-sizing: border-box;
|
|
47
|
+
min-height: var(--bp-spacing-20);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.textarea::placeholder {
|
|
51
|
+
color: var(--bp-color-text-muted);
|
|
52
|
+
opacity: var(--bp-opacity-subtle);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* Variants */
|
|
56
|
+
.textarea--default {
|
|
57
|
+
border-color: var(--bp-color-border);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.textarea--success {
|
|
61
|
+
border-color: var(--bp-color-success);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.textarea--error {
|
|
65
|
+
border-color: var(--bp-color-error);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.textarea--warning {
|
|
69
|
+
border-color: var(--bp-color-warning);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.textarea--info {
|
|
73
|
+
border-color: var(--bp-color-info);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* Sizes */
|
|
77
|
+
.textarea--sm {
|
|
78
|
+
font-size: var(--bp-font-size-sm);
|
|
79
|
+
padding: var(--bp-spacing-xs) var(--bp-spacing-sm);
|
|
80
|
+
min-height: var(--bp-spacing-16);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.textarea--md {
|
|
84
|
+
font-size: var(--bp-font-size-base);
|
|
85
|
+
padding: var(--bp-spacing-sm) var(--bp-spacing-md);
|
|
86
|
+
min-height: var(--bp-spacing-20);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.textarea--lg {
|
|
90
|
+
font-size: var(--bp-font-size-lg);
|
|
91
|
+
padding: var(--bp-spacing-md) var(--bp-spacing-lg);
|
|
92
|
+
min-height: var(--bp-spacing-24);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* Resize variants */
|
|
96
|
+
.textarea--resize-none {
|
|
97
|
+
resize: none;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.textarea--resize-both {
|
|
101
|
+
resize: both;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.textarea--resize-horizontal {
|
|
105
|
+
resize: horizontal;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.textarea--resize-vertical {
|
|
109
|
+
resize: vertical;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* States */
|
|
113
|
+
.textarea:hover:not(:disabled):not(:focus) {
|
|
114
|
+
border-color: var(--bp-color-border-strong);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.textarea:focus {
|
|
118
|
+
outline: none;
|
|
119
|
+
border-color: var(--bp-color-focus);
|
|
120
|
+
box-shadow: 0 0 0 var(--bp-focus-offset) var(--bp-color-focus);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.textarea:focus-visible {
|
|
124
|
+
outline: none;
|
|
125
|
+
border-color: var(--bp-color-focus);
|
|
126
|
+
box-shadow: 0 0 0 var(--bp-focus-offset) var(--bp-color-focus);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.textarea:disabled {
|
|
130
|
+
opacity: var(--bp-opacity-disabled);
|
|
131
|
+
cursor: not-allowed;
|
|
132
|
+
background-color: var(--bp-color-surface-subdued);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.textarea:read-only {
|
|
136
|
+
background-color: var(--bp-color-surface);
|
|
137
|
+
cursor: default;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* Variant-specific focus states */
|
|
141
|
+
.textarea--success:focus,
|
|
142
|
+
.textarea--success:focus-visible {
|
|
143
|
+
border-color: var(--bp-color-success);
|
|
144
|
+
box-shadow: 0 0 0 var(--bp-focus-offset) var(--bp-color-success);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.textarea--error:focus,
|
|
148
|
+
.textarea--error:focus-visible {
|
|
149
|
+
border-color: var(--bp-color-error);
|
|
150
|
+
box-shadow: 0 0 0 var(--bp-focus-offset) var(--bp-color-error);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.textarea--warning:focus,
|
|
154
|
+
.textarea--warning:focus-visible {
|
|
155
|
+
border-color: var(--bp-color-warning);
|
|
156
|
+
box-shadow: 0 0 0 var(--bp-focus-offset) var(--bp-color-warning);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.textarea--info:focus,
|
|
160
|
+
.textarea--info:focus-visible {
|
|
161
|
+
border-color: var(--bp-color-info);
|
|
162
|
+
box-shadow: 0 0 0 var(--bp-focus-offset) var(--bp-color-info);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/* Messages */
|
|
166
|
+
.textarea-message {
|
|
167
|
+
font-family: var(--bp-font-family);
|
|
168
|
+
font-size: var(--bp-font-size-sm);
|
|
169
|
+
line-height: var(--bp-line-height-normal);
|
|
170
|
+
color: var(--bp-color-text-muted);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.textarea-message--error {
|
|
174
|
+
color: var(--bp-color-error);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* iOS zoom prevention: ensure 16px minimum on touch devices */
|
|
178
|
+
@media (max-width: 768px) {
|
|
179
|
+
.textarea--sm {
|
|
180
|
+
font-size: 16px;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
`;
|
|
184
|
+
var w = Object.defineProperty, z = Object.getOwnPropertyDescriptor, r = (t, o, n, p) => {
|
|
185
|
+
for (var i = p > 1 ? void 0 : p ? z(o, n) : o, c = t.length - 1, b; c >= 0; c--)
|
|
186
|
+
(b = t[c]) && (i = (p ? b(o, n, i) : b(i)) || i);
|
|
187
|
+
return p && i && w(o, n, i), i;
|
|
188
|
+
};
|
|
189
|
+
let e = class extends d {
|
|
190
|
+
constructor() {
|
|
191
|
+
super(), this.debouncedDispatchInput = x(
|
|
192
|
+
(t, o) => {
|
|
193
|
+
this.dispatchEvent(
|
|
194
|
+
new CustomEvent("bp-input", {
|
|
195
|
+
detail: { value: t, originalEvent: o },
|
|
196
|
+
bubbles: !0,
|
|
197
|
+
composed: !0
|
|
198
|
+
})
|
|
199
|
+
);
|
|
200
|
+
},
|
|
201
|
+
150
|
|
202
|
+
), this.variant = "default", this.size = "md", this.value = "", this.disabled = !1, this.required = !1, this.readonly = !1, this.resize = "vertical", this.spellcheck = !0;
|
|
203
|
+
}
|
|
204
|
+
disconnectedCallback() {
|
|
205
|
+
super.disconnectedCallback(), this.debouncedDispatchInput.cancel();
|
|
206
|
+
}
|
|
207
|
+
handleInput(t) {
|
|
208
|
+
const o = t.target;
|
|
209
|
+
this.value = o.value, this.debouncedDispatchInput(this.value, t);
|
|
210
|
+
}
|
|
211
|
+
handleChange(t) {
|
|
212
|
+
const o = t.target;
|
|
213
|
+
this.value = o.value, this.dispatchEvent(
|
|
214
|
+
new CustomEvent("bp-change", {
|
|
215
|
+
detail: { value: this.value, originalEvent: t },
|
|
216
|
+
bubbles: !0,
|
|
217
|
+
composed: !0
|
|
218
|
+
})
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
handleFocus(t) {
|
|
222
|
+
this.dispatchEvent(
|
|
223
|
+
new CustomEvent("bp-focus", {
|
|
224
|
+
detail: { originalEvent: t },
|
|
225
|
+
bubbles: !0,
|
|
226
|
+
composed: !0
|
|
227
|
+
})
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
handleBlur(t) {
|
|
231
|
+
this.debouncedDispatchInput.flush(), this.dispatchEvent(
|
|
232
|
+
new CustomEvent("bp-blur", {
|
|
233
|
+
detail: { originalEvent: t },
|
|
234
|
+
bubbles: !0,
|
|
235
|
+
composed: !0
|
|
236
|
+
})
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Focuses the textarea element
|
|
241
|
+
*/
|
|
242
|
+
focus() {
|
|
243
|
+
this.textareaElement?.focus();
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Blurs the textarea element
|
|
247
|
+
*/
|
|
248
|
+
blur() {
|
|
249
|
+
this.textareaElement?.blur();
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Selects the text in the textarea
|
|
253
|
+
*/
|
|
254
|
+
select() {
|
|
255
|
+
this.textareaElement?.select();
|
|
256
|
+
}
|
|
257
|
+
get messageId() {
|
|
258
|
+
const t = this.variant === "error" && this.errorMessage, o = this.helperText && !t;
|
|
259
|
+
return t ? "error-message" : o ? "helper-text" : "";
|
|
260
|
+
}
|
|
261
|
+
render() {
|
|
262
|
+
const t = this.variant === "error" && this.errorMessage, o = this.helperText && !t;
|
|
263
|
+
return l`
|
|
264
|
+
<div class="textarea-wrapper">
|
|
265
|
+
${this.label ? l`
|
|
266
|
+
<label class="textarea-label" for="textarea">
|
|
267
|
+
${this.label}
|
|
268
|
+
${this.required ? l`<span class="textarea-required">*</span>` : ""}
|
|
269
|
+
</label>
|
|
270
|
+
` : ""}
|
|
271
|
+
|
|
272
|
+
<textarea
|
|
273
|
+
part="textarea"
|
|
274
|
+
id="textarea"
|
|
275
|
+
class="textarea textarea--${this.variant} textarea--${this.size} textarea--resize-${this.resize}"
|
|
276
|
+
.value=${m(this.value)}
|
|
277
|
+
placeholder=${s(this.placeholder)}
|
|
278
|
+
?disabled=${this.disabled}
|
|
279
|
+
?required=${this.required}
|
|
280
|
+
?readonly=${this.readonly}
|
|
281
|
+
name=${s(this.name)}
|
|
282
|
+
rows=${s(this.rows)}
|
|
283
|
+
cols=${s(this.cols)}
|
|
284
|
+
maxlength=${s(this.maxlength)}
|
|
285
|
+
minlength=${s(this.minlength)}
|
|
286
|
+
autocomplete=${s(this.autocomplete)}
|
|
287
|
+
?spellcheck=${this.spellcheck}
|
|
288
|
+
wrap=${s(this.wrap)}
|
|
289
|
+
aria-invalid=${this.variant === "error" ? "true" : "false"}
|
|
290
|
+
aria-describedby=${this.messageId || h}
|
|
291
|
+
@input=${this.handleInput}
|
|
292
|
+
@change=${this.handleChange}
|
|
293
|
+
@focus=${this.handleFocus}
|
|
294
|
+
@blur=${this.handleBlur}
|
|
295
|
+
></textarea>
|
|
296
|
+
|
|
297
|
+
${t ? l`
|
|
298
|
+
<div
|
|
299
|
+
id="error-message"
|
|
300
|
+
class="textarea-message textarea-message--error"
|
|
301
|
+
role="alert"
|
|
302
|
+
>
|
|
303
|
+
${this.errorMessage}
|
|
304
|
+
</div>
|
|
305
|
+
` : ""}
|
|
306
|
+
${o ? l`<div id="helper-text" class="textarea-message">
|
|
307
|
+
${this.helperText}
|
|
308
|
+
</div>` : ""}
|
|
309
|
+
</div>
|
|
310
|
+
`;
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
e.styles = [y];
|
|
314
|
+
r([
|
|
315
|
+
a({ type: String, reflect: !0 })
|
|
316
|
+
], e.prototype, "variant", 2);
|
|
317
|
+
r([
|
|
318
|
+
a({ type: String, reflect: !0 })
|
|
319
|
+
], e.prototype, "size", 2);
|
|
320
|
+
r([
|
|
321
|
+
a({ type: String, reflect: !0 })
|
|
322
|
+
], e.prototype, "value", 2);
|
|
323
|
+
r([
|
|
324
|
+
a({ type: String, reflect: !0 })
|
|
325
|
+
], e.prototype, "placeholder", 2);
|
|
326
|
+
r([
|
|
327
|
+
a({ type: String, reflect: !0 })
|
|
328
|
+
], e.prototype, "label", 2);
|
|
329
|
+
r([
|
|
330
|
+
a({ type: String, reflect: !0 })
|
|
331
|
+
], e.prototype, "helperText", 2);
|
|
332
|
+
r([
|
|
333
|
+
a({ type: String, reflect: !0 })
|
|
334
|
+
], e.prototype, "errorMessage", 2);
|
|
335
|
+
r([
|
|
336
|
+
a({ type: Boolean, reflect: !0 })
|
|
337
|
+
], e.prototype, "disabled", 2);
|
|
338
|
+
r([
|
|
339
|
+
a({ type: Boolean, reflect: !0 })
|
|
340
|
+
], e.prototype, "required", 2);
|
|
341
|
+
r([
|
|
342
|
+
a({ type: Boolean, reflect: !0 })
|
|
343
|
+
], e.prototype, "readonly", 2);
|
|
344
|
+
r([
|
|
345
|
+
a({ type: String, reflect: !0 })
|
|
346
|
+
], e.prototype, "name", 2);
|
|
347
|
+
r([
|
|
348
|
+
a({ type: Number, reflect: !0 })
|
|
349
|
+
], e.prototype, "rows", 2);
|
|
350
|
+
r([
|
|
351
|
+
a({ type: Number, reflect: !0 })
|
|
352
|
+
], e.prototype, "cols", 2);
|
|
353
|
+
r([
|
|
354
|
+
a({ type: Number, reflect: !0 })
|
|
355
|
+
], e.prototype, "maxlength", 2);
|
|
356
|
+
r([
|
|
357
|
+
a({ type: Number, reflect: !0 })
|
|
358
|
+
], e.prototype, "minlength", 2);
|
|
359
|
+
r([
|
|
360
|
+
a({ type: String, reflect: !0 })
|
|
361
|
+
], e.prototype, "resize", 2);
|
|
362
|
+
r([
|
|
363
|
+
a({ type: String, reflect: !0 })
|
|
364
|
+
], e.prototype, "autocomplete", 2);
|
|
365
|
+
r([
|
|
366
|
+
a({ converter: g, reflect: !0 })
|
|
367
|
+
], e.prototype, "spellcheck", 2);
|
|
368
|
+
r([
|
|
369
|
+
a({ type: String, reflect: !0 })
|
|
370
|
+
], e.prototype, "wrap", 2);
|
|
371
|
+
r([
|
|
372
|
+
f("textarea")
|
|
373
|
+
], e.prototype, "textareaElement", 2);
|
|
374
|
+
e = r([
|
|
375
|
+
v("bp-textarea")
|
|
376
|
+
], e);
|
|
377
|
+
export {
|
|
378
|
+
e as BpTextarea
|
|
379
|
+
};
|
|
380
|
+
//# sourceMappingURL=textarea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textarea.js","sources":["../../source/components/textarea/textarea.style.ts","../../source/components/textarea/textarea.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const textareaStyles = css`\n /* Base styles */\n :host {\n display: block;\n }\n\n .textarea-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--bp-spacing-xs);\n }\n\n .textarea-label {\n font-family: var(--bp-font-family);\n font-size: var(--bp-font-size-sm);\n font-weight: var(--bp-font-weight-medium);\n color: var(--bp-color-text);\n line-height: var(--bp-line-height-normal);\n }\n\n .textarea-required {\n color: var(--bp-color-error);\n margin-left: var(--bp-spacing-xs);\n }\n\n .textarea {\n font-family: var(--bp-font-family);\n font-size: var(--bp-font-size-base);\n line-height: var(--bp-line-height-normal);\n color: var(--bp-color-text);\n background-color: var(--bp-color-background);\n border: var(--bp-border-width) solid var(--bp-color-border);\n border-radius: var(--bp-border-radius-md);\n padding: var(--bp-spacing-sm) var(--bp-spacing-md);\n box-shadow: inset 0 1px 2px oklch(0 0 0 / 0.05);\n transition:\n border-color var(--bp-transition-fast),\n box-shadow var(--bp-transition-fast);\n width: 100%;\n box-sizing: border-box;\n min-height: var(--bp-spacing-20);\n }\n\n .textarea::placeholder {\n color: var(--bp-color-text-muted);\n opacity: var(--bp-opacity-subtle);\n }\n\n /* Variants */\n .textarea--default {\n border-color: var(--bp-color-border);\n }\n\n .textarea--success {\n border-color: var(--bp-color-success);\n }\n\n .textarea--error {\n border-color: var(--bp-color-error);\n }\n\n .textarea--warning {\n border-color: var(--bp-color-warning);\n }\n\n .textarea--info {\n border-color: var(--bp-color-info);\n }\n\n /* Sizes */\n .textarea--sm {\n font-size: var(--bp-font-size-sm);\n padding: var(--bp-spacing-xs) var(--bp-spacing-sm);\n min-height: var(--bp-spacing-16);\n }\n\n .textarea--md {\n font-size: var(--bp-font-size-base);\n padding: var(--bp-spacing-sm) var(--bp-spacing-md);\n min-height: var(--bp-spacing-20);\n }\n\n .textarea--lg {\n font-size: var(--bp-font-size-lg);\n padding: var(--bp-spacing-md) var(--bp-spacing-lg);\n min-height: var(--bp-spacing-24);\n }\n\n /* Resize variants */\n .textarea--resize-none {\n resize: none;\n }\n\n .textarea--resize-both {\n resize: both;\n }\n\n .textarea--resize-horizontal {\n resize: horizontal;\n }\n\n .textarea--resize-vertical {\n resize: vertical;\n }\n\n /* States */\n .textarea:hover:not(:disabled):not(:focus) {\n border-color: var(--bp-color-border-strong);\n }\n\n .textarea:focus {\n outline: none;\n border-color: var(--bp-color-focus);\n box-shadow: 0 0 0 var(--bp-focus-offset) var(--bp-color-focus);\n }\n\n .textarea:focus-visible {\n outline: none;\n border-color: var(--bp-color-focus);\n box-shadow: 0 0 0 var(--bp-focus-offset) var(--bp-color-focus);\n }\n\n .textarea:disabled {\n opacity: var(--bp-opacity-disabled);\n cursor: not-allowed;\n background-color: var(--bp-color-surface-subdued);\n }\n\n .textarea:read-only {\n background-color: var(--bp-color-surface);\n cursor: default;\n }\n\n /* Variant-specific focus states */\n .textarea--success:focus,\n .textarea--success:focus-visible {\n border-color: var(--bp-color-success);\n box-shadow: 0 0 0 var(--bp-focus-offset) var(--bp-color-success);\n }\n\n .textarea--error:focus,\n .textarea--error:focus-visible {\n border-color: var(--bp-color-error);\n box-shadow: 0 0 0 var(--bp-focus-offset) var(--bp-color-error);\n }\n\n .textarea--warning:focus,\n .textarea--warning:focus-visible {\n border-color: var(--bp-color-warning);\n box-shadow: 0 0 0 var(--bp-focus-offset) var(--bp-color-warning);\n }\n\n .textarea--info:focus,\n .textarea--info:focus-visible {\n border-color: var(--bp-color-info);\n box-shadow: 0 0 0 var(--bp-focus-offset) var(--bp-color-info);\n }\n\n /* Messages */\n .textarea-message {\n font-family: var(--bp-font-family);\n font-size: var(--bp-font-size-sm);\n line-height: var(--bp-line-height-normal);\n color: var(--bp-color-text-muted);\n }\n\n .textarea-message--error {\n color: var(--bp-color-error);\n }\n\n /* iOS zoom prevention: ensure 16px minimum on touch devices */\n @media (max-width: 768px) {\n .textarea--sm {\n font-size: 16px;\n }\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\r\nimport { customElement, property, query } from 'lit/decorators.js';\r\nimport { ifDefined } from 'lit/directives/if-defined.js';\r\nimport { live } from 'lit/directives/live.js';\r\nimport { textareaStyles } from './textarea.style.js';\r\nimport { debounce } from '../../utilities/debounce.js';\r\nimport { booleanConverter } from '../../utilities/boolean-converter.js';\r\n\r\n/**\r\n * Visual variant that affects the textarea border color and validation state\r\n */\r\nexport type TextareaVariant =\r\n | 'default'\r\n | 'success'\r\n | 'error'\r\n | 'warning'\r\n | 'info';\r\n\r\n/**\r\n * Size of the textarea affecting padding, font size, and minimum height\r\n */\r\nexport type TextareaSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * Resize mode determining how users can resize the textarea\r\n */\r\nexport type TextareaResize = 'none' | 'both' | 'horizontal' | 'vertical';\r\n\r\n/**\r\n * Valid autocomplete values for textarea elements\r\n */\r\nexport type TextareaAutocomplete =\r\n | 'off'\r\n | 'on'\r\n | 'name'\r\n | 'email'\r\n | 'username'\r\n | 'street-address'\r\n | 'address-line1'\r\n | 'address-line2'\r\n | 'address-line3'\r\n | 'address-level1'\r\n | 'address-level2'\r\n | 'address-level3'\r\n | 'address-level4'\r\n | 'country'\r\n | 'country-name'\r\n | 'postal-code'\r\n | 'organization'\r\n | 'organization-title';\r\n\r\n/**\r\n * A multi-line text input component with support for various states and configurations.\r\n *\r\n * @fires bp-input - Dispatched when the textarea value changes (on every keystroke)\r\n * @fires bp-change - Dispatched when the textarea loses focus after being changed\r\n * @fires bp-focus - Dispatched when the textarea receives focus\r\n * @fires bp-blur - Dispatched when the textarea loses focus\r\n */\r\n@customElement('bp-textarea')\r\nexport class BpTextarea extends LitElement {\r\n /** Visual variant of the textarea */\r\n @property({ type: String, reflect: true }) declare variant: TextareaVariant;\r\n\r\n /** Size of the textarea */\r\n @property({ type: String, reflect: true }) declare size: TextareaSize;\r\n\r\n /** Current value of the textarea */\r\n @property({ type: String, reflect: true }) declare value: string;\r\n\r\n /** Placeholder text shown when textarea is empty */\r\n @property({ type: String, reflect: true }) declare placeholder:\r\n | string\r\n | undefined;\r\n\r\n /** Label text displayed above the textarea */\r\n @property({ type: String, reflect: true }) declare label: string | undefined;\r\n\r\n /** Helper text displayed below the textarea */\r\n @property({ type: String, reflect: true }) declare helperText:\r\n | string\r\n | undefined;\r\n\r\n /** Error message displayed when variant is 'error' */\r\n @property({ type: String, reflect: true }) declare errorMessage:\r\n | string\r\n | undefined;\r\n\r\n /** Whether the textarea is disabled */\r\n @property({ type: Boolean, reflect: true }) declare disabled: boolean;\r\n\r\n /** Whether the textarea is required */\r\n @property({ type: Boolean, reflect: true }) declare required: boolean;\r\n\r\n /** Whether the textarea is readonly */\r\n @property({ type: Boolean, reflect: true }) declare readonly: boolean;\r\n\r\n /** Name attribute for form submission */\r\n @property({ type: String, reflect: true }) declare name: string | undefined;\r\n\r\n /** Number of visible text rows */\r\n @property({ type: Number, reflect: true }) declare rows: number | undefined;\r\n\r\n /** Number of visible text columns */\r\n @property({ type: Number, reflect: true }) declare cols: number | undefined;\r\n\r\n /** Maximum number of characters allowed */\r\n @property({ type: Number, reflect: true }) declare maxlength:\r\n | number\r\n | undefined;\r\n\r\n /** Minimum number of characters required */\r\n @property({ type: Number, reflect: true }) declare minlength:\r\n | number\r\n | undefined;\r\n\r\n /** How the textarea can be resized by the user */\r\n @property({ type: String, reflect: true }) declare resize: TextareaResize;\r\n\r\n /** Autocomplete attribute for browser suggestions */\r\n @property({ type: String, reflect: true }) declare autocomplete:\r\n | TextareaAutocomplete\r\n | undefined;\r\n\r\n /** Whether to enable spellcheck */\r\n @property({ converter: booleanConverter, reflect: true })\r\n declare spellcheck: boolean;\r\n\r\n /** Wrap attribute for text wrapping behavior */\r\n @property({ type: String, reflect: true }) declare wrap:\r\n | 'soft'\r\n | 'hard'\r\n | undefined;\r\n\r\n @query('textarea') private textareaElement?: HTMLTextAreaElement;\r\n\r\n private debouncedDispatchInput = debounce(\r\n (value: string, originalEvent: InputEvent) => {\r\n this.dispatchEvent(\r\n new CustomEvent('bp-input', {\r\n detail: { value, originalEvent },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n },\r\n 150\r\n );\r\n\r\n static styles = [textareaStyles];\r\n\r\n constructor() {\r\n super();\r\n this.variant = 'default';\r\n this.size = 'md';\r\n this.value = '';\r\n this.disabled = false;\r\n this.required = false;\r\n this.readonly = false;\r\n this.resize = 'vertical';\r\n this.spellcheck = true;\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this.debouncedDispatchInput.cancel();\r\n }\r\n\r\n private handleInput(event: InputEvent): void {\r\n const target = event.target as HTMLTextAreaElement;\r\n this.value = target.value;\r\n this.debouncedDispatchInput(this.value, event);\r\n }\r\n\r\n private handleChange(event: Event): void {\r\n const target = event.target as HTMLTextAreaElement;\r\n this.value = target.value;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent('bp-change', {\r\n detail: { value: this.value, originalEvent: event },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private handleFocus(event: FocusEvent): void {\r\n this.dispatchEvent(\r\n new CustomEvent('bp-focus', {\r\n detail: { originalEvent: event },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private handleBlur(event: FocusEvent): void {\r\n this.debouncedDispatchInput.flush();\r\n this.dispatchEvent(\r\n new CustomEvent('bp-blur', {\r\n detail: { originalEvent: event },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Focuses the textarea element\r\n */\r\n public focus(): void {\r\n this.textareaElement?.focus();\r\n }\r\n\r\n /**\r\n * Blurs the textarea element\r\n */\r\n public blur(): void {\r\n this.textareaElement?.blur();\r\n }\r\n\r\n /**\r\n * Selects the text in the textarea\r\n */\r\n public select(): void {\r\n this.textareaElement?.select();\r\n }\r\n\r\n private get messageId(): string {\r\n const showError = this.variant === 'error' && this.errorMessage;\r\n const showHelper = this.helperText && !showError;\r\n if (showError) return 'error-message';\r\n if (showHelper) return 'helper-text';\r\n return '';\r\n }\r\n\r\n render() {\r\n const showError = this.variant === 'error' && this.errorMessage;\r\n const showHelper = this.helperText && !showError;\r\n\r\n return html`\r\n <div class=\"textarea-wrapper\">\r\n ${this.label\r\n ? html`\r\n <label class=\"textarea-label\" for=\"textarea\">\r\n ${this.label}\r\n ${this.required\r\n ? html`<span class=\"textarea-required\">*</span>`\r\n : ''}\r\n </label>\r\n `\r\n : ''}\r\n\r\n <textarea\r\n part=\"textarea\"\r\n id=\"textarea\"\r\n class=\"textarea textarea--${this.variant} textarea--${this\r\n .size} textarea--resize-${this.resize}\"\r\n .value=${live(this.value)}\r\n placeholder=${ifDefined(this.placeholder)}\r\n ?disabled=${this.disabled}\r\n ?required=${this.required}\r\n ?readonly=${this.readonly}\r\n name=${ifDefined(this.name)}\r\n rows=${ifDefined(this.rows)}\r\n cols=${ifDefined(this.cols)}\r\n maxlength=${ifDefined(this.maxlength)}\r\n minlength=${ifDefined(this.minlength)}\r\n autocomplete=${ifDefined(this.autocomplete)}\r\n ?spellcheck=${this.spellcheck}\r\n wrap=${ifDefined(this.wrap)}\r\n aria-invalid=${this.variant === 'error' ? 'true' : 'false'}\r\n aria-describedby=${this.messageId || nothing}\r\n @input=${this.handleInput}\r\n @change=${this.handleChange}\r\n @focus=${this.handleFocus}\r\n @blur=${this.handleBlur}\r\n ></textarea>\r\n\r\n ${showError\r\n ? html`\r\n <div\r\n id=\"error-message\"\r\n class=\"textarea-message textarea-message--error\"\r\n role=\"alert\"\r\n >\r\n ${this.errorMessage}\r\n </div>\r\n `\r\n : ''}\r\n ${showHelper\r\n ? html`<div id=\"helper-text\" class=\"textarea-message\">\r\n ${this.helperText}\r\n </div>`\r\n : ''}\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'bp-textarea': BpTextarea;\r\n }\r\n}\r\n"],"names":["textareaStyles","css","BpTextarea","LitElement","debounce","value","originalEvent","event","target","showError","showHelper","html","live","ifDefined","nothing","__decorateClass","property","booleanConverter","query","customElement"],"mappings":"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"}
|