bromcom-ui 3.0.0-alpha.3 → 3.0.0-alpha.5

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 (156) hide show
  1. package/dist/bromcom-ui/bromcom-ui.css +1 -1
  2. package/dist/bromcom-ui/bromcom-ui.esm.js +1 -1
  3. package/dist/bromcom-ui/p-01eaca9a.entry.js +5 -0
  4. package/dist/bromcom-ui/{p-dc8b7bd5.entry.js → p-0b7de283.entry.js} +1 -1
  5. package/dist/bromcom-ui/{p-ff8adde6.entry.js → p-0e75f6ba.entry.js} +1 -1
  6. package/dist/bromcom-ui/{p-3a6e9576.entry.js → p-112b9a62.entry.js} +1 -1
  7. package/dist/bromcom-ui/{p-be96827e.js → p-1535f9b1.js} +1 -1
  8. package/dist/bromcom-ui/{p-ef839034.entry.js → p-32ce6cf6.entry.js} +1 -1
  9. package/dist/bromcom-ui/{p-33d97b3f.entry.js → p-33b2ed75.entry.js} +1 -1
  10. package/dist/bromcom-ui/p-3ddd3c83.entry.js +5 -0
  11. package/dist/bromcom-ui/{p-e115af8a.entry.js → p-4545a13d.entry.js} +1 -1
  12. package/dist/bromcom-ui/{p-f1de8ed5.entry.js → p-5532696c.entry.js} +1 -1
  13. package/dist/bromcom-ui/{p-f6e710ff.entry.js → p-69adb859.entry.js} +1 -1
  14. package/dist/bromcom-ui/{p-d0647951.js → p-6ce02d0a.js} +1 -1
  15. package/dist/bromcom-ui/p-7c08789d.entry.js +5 -0
  16. package/dist/bromcom-ui/{p-b7f449ff.entry.js → p-803739bc.entry.js} +1 -1
  17. package/dist/bromcom-ui/{p-3b988ad1.entry.js → p-8390dd02.entry.js} +1 -1
  18. package/dist/bromcom-ui/p-91197b04.js +5 -0
  19. package/dist/bromcom-ui/{p-b9b9d753.entry.js → p-a80e6310.entry.js} +1 -1
  20. package/dist/bromcom-ui/p-aa67918a.entry.js +5 -0
  21. package/dist/bromcom-ui/{p-91aa21af.entry.js → p-acab07ec.entry.js} +1 -1
  22. package/dist/bromcom-ui/{p-a53c3682.entry.js → p-b333a3d7.entry.js} +1 -1
  23. package/dist/bromcom-ui/{p-b386e9c9.entry.js → p-b7787c11.entry.js} +1 -1
  24. package/dist/bromcom-ui/{p-2e7ffc5a.entry.js → p-b7c56cbe.entry.js} +1 -1
  25. package/dist/bromcom-ui/{p-221095a9.entry.js → p-c36a7889.entry.js} +1 -1
  26. package/dist/bromcom-ui/p-ce0ab4e3.entry.js +5 -0
  27. package/dist/bromcom-ui/{p-ee75cd00.js → p-d3cf91a9.js} +1 -1
  28. package/dist/bromcom-ui/p-d5464577.entry.js +16 -0
  29. package/dist/bromcom-ui/{p-bd77f532.entry.js → p-d7a619c5.entry.js} +1 -1
  30. package/dist/bromcom-ui/{p-baa4193d.entry.js → p-e36b6b08.entry.js} +1 -1
  31. package/dist/bromcom-ui/{p-6c7fdf95.entry.js → p-f15c1d3d.entry.js} +1 -1
  32. package/dist/bromcom-ui/{p-8001040c.js → p-fc29c94d.js} +1 -1
  33. package/dist/cjs/bcm-accordion_69.cjs.entry.js +722 -66
  34. package/dist/cjs/bcm-attendance-actions-comment.cjs.entry.js +4 -4
  35. package/dist/cjs/bcm-attendance-actions-dropdown.cjs.entry.js +4 -4
  36. package/dist/cjs/bcm-breadcrumb.cjs.entry.js +2 -2
  37. package/dist/cjs/bcm-caption.cjs.entry.js +4 -4
  38. package/dist/cjs/bcm-card.cjs.entry.js +2 -2
  39. package/dist/cjs/bcm-date-picker.cjs.entry.js +2 -2
  40. package/dist/cjs/bcm-datetime-picker.cjs.entry.js +2 -2
  41. package/dist/cjs/bcm-default.cjs.entry.js +2 -2
  42. package/dist/cjs/bcm-file-upload.cjs.entry.js +578 -0
  43. package/dist/cjs/bcm-form-2.cjs.entry.js +3 -2
  44. package/dist/cjs/bcm-input-2.cjs.entry.js +2 -2
  45. package/dist/cjs/bcm-input-custom.cjs.entry.js +2 -2
  46. package/dist/cjs/bcm-input-dropdown.cjs.entry.js +4 -4
  47. package/dist/cjs/bcm-modal-2-footer.cjs.entry.js +4 -4
  48. package/dist/cjs/bcm-modal-2-header.cjs.entry.js +4 -4
  49. package/dist/cjs/bcm-modal-2.cjs.entry.js +4 -4
  50. package/dist/cjs/bcm-number-input.cjs.entry.js +12 -6
  51. package/dist/cjs/bcm-skeleton.cjs.entry.js +4 -4
  52. package/dist/cjs/bcm-table.cjs.entry.js +4 -4
  53. package/dist/cjs/bcm-tag.cjs.entry.js +3 -3
  54. package/dist/cjs/bcm-time-picker.cjs.entry.js +2 -2
  55. package/dist/cjs/bcm-toast.cjs.entry.js +17 -11
  56. package/dist/cjs/bromcom-ui.cjs.js +3 -3
  57. package/dist/cjs/{generate-554f54dc.js → generate-9d1bf6b3.js} +1 -1
  58. package/dist/cjs/{global-90b5dbce.js → global-d69a64ec.js} +1 -1
  59. package/dist/cjs/loader.cjs.js +3 -3
  60. package/dist/cjs/{number-helper-677e9c02.js → number-helper-ae28b255.js} +1 -1
  61. package/dist/cjs/old-bcm-popover-box.cjs.entry.js +3 -3
  62. package/dist/cjs/old-bcm-popover.cjs.entry.js +2 -2
  63. package/dist/cjs/{package-8445ccd4.js → package-6de220be.js} +1 -1
  64. package/dist/cjs/{validators-92f2f1ef.js → validators-3381bee2.js} +1 -1
  65. package/dist/collection/collection-manifest.json +1 -0
  66. package/dist/collection/components/atoms/button/button.js +1 -1
  67. package/dist/collection/components/atoms/button/types.js +7 -0
  68. package/dist/collection/components/molecules/color-input/color-input.js +5 -22
  69. package/dist/collection/components/molecules/color-palette/color-palette.js +4 -4
  70. package/dist/collection/components/molecules/dropdown/dropdown.js +36 -1
  71. package/dist/collection/components/molecules/linked/linked-focus-manager.js +86 -0
  72. package/dist/collection/components/molecules/linked/linked.js +43 -1
  73. package/dist/collection/components/molecules/number-input/number-input.js +8 -2
  74. package/dist/collection/components/molecules/number-input/react-input.js +1 -1
  75. package/dist/collection/components/molecules/upload/file-upload.component.js +1060 -0
  76. package/dist/collection/components/molecules/upload/file-upload.style.js +201 -0
  77. package/dist/collection/components/organism/form/form.js +1 -0
  78. package/dist/collection/components/organism/form-2/bcm-form-components.js +1 -0
  79. package/dist/collection/components/organism/list/list-focus-manager.js +344 -0
  80. package/dist/collection/components/organism/list/list-key-control.js +9 -4
  81. package/dist/collection/components/organism/list/list.css +8 -3
  82. package/dist/collection/components/organism/list/list.js +227 -27
  83. package/dist/collection/components/other/toast/toast.js +15 -9
  84. package/dist/collection/components/other_deprecated/old-tag/old-tag.js +1 -1
  85. package/dist/collection/components/other_deprecated/tag/tag.js +1 -1
  86. package/dist/collection/templates/list-item-template.js +6 -5
  87. package/dist/collection/templates/list-template.js +2 -2
  88. package/dist/components/bcm-color-input.js +5 -22
  89. package/dist/components/bcm-dropdown.js +35 -0
  90. package/dist/components/bcm-file-upload.d.ts +11 -0
  91. package/dist/components/bcm-file-upload.js +625 -0
  92. package/dist/components/bcm-form-2.js +1 -0
  93. package/dist/components/bcm-number-input.js +8 -2
  94. package/dist/components/bcm-toast.js +15 -9
  95. package/dist/components/button.js +7 -0
  96. package/dist/components/color-palette.js +2 -2
  97. package/dist/components/form.js +1 -0
  98. package/dist/components/generate.js +1 -1
  99. package/dist/components/index.d.ts +1 -0
  100. package/dist/components/index.js +1 -0
  101. package/dist/components/linked.js +105 -2
  102. package/dist/components/list.js +567 -39
  103. package/dist/esm/bcm-accordion_69.entry.js +722 -66
  104. package/dist/esm/bcm-attendance-actions-comment.entry.js +4 -4
  105. package/dist/esm/bcm-attendance-actions-dropdown.entry.js +4 -4
  106. package/dist/esm/bcm-breadcrumb.entry.js +2 -2
  107. package/dist/esm/bcm-caption.entry.js +4 -4
  108. package/dist/esm/bcm-card.entry.js +2 -2
  109. package/dist/esm/bcm-date-picker.entry.js +2 -2
  110. package/dist/esm/bcm-datetime-picker.entry.js +2 -2
  111. package/dist/esm/bcm-default.entry.js +2 -2
  112. package/dist/esm/bcm-file-upload.entry.js +574 -0
  113. package/dist/esm/bcm-form-2.entry.js +3 -2
  114. package/dist/esm/bcm-input-2.entry.js +2 -2
  115. package/dist/esm/bcm-input-custom.entry.js +2 -2
  116. package/dist/esm/bcm-input-dropdown.entry.js +4 -4
  117. package/dist/esm/bcm-modal-2-footer.entry.js +4 -4
  118. package/dist/esm/bcm-modal-2-header.entry.js +4 -4
  119. package/dist/esm/bcm-modal-2.entry.js +4 -4
  120. package/dist/esm/bcm-number-input.entry.js +12 -6
  121. package/dist/esm/bcm-skeleton.entry.js +4 -4
  122. package/dist/esm/bcm-table.entry.js +4 -4
  123. package/dist/esm/bcm-tag.entry.js +3 -3
  124. package/dist/esm/bcm-time-picker.entry.js +2 -2
  125. package/dist/esm/bcm-toast.entry.js +17 -11
  126. package/dist/esm/bromcom-ui.js +3 -3
  127. package/dist/esm/{generate-8a394b83.js → generate-56d49b70.js} +1 -1
  128. package/dist/esm/{global-7919f57f.js → global-97c42a5f.js} +1 -1
  129. package/dist/esm/loader.js +3 -3
  130. package/dist/esm/{number-helper-a86adc72.js → number-helper-455ab41e.js} +1 -1
  131. package/dist/esm/old-bcm-popover-box.entry.js +3 -3
  132. package/dist/esm/old-bcm-popover.entry.js +2 -2
  133. package/dist/esm/{package-278e08d9.js → package-edee14d5.js} +1 -1
  134. package/dist/esm/{validators-89e791a1.js → validators-cc882165.js} +1 -1
  135. package/dist/types/components/atoms/button/types.d.ts +8 -1
  136. package/dist/types/components/molecules/color-input/color-input.d.ts +1 -4
  137. package/dist/types/components/molecules/dropdown/dropdown.d.ts +7 -0
  138. package/dist/types/components/molecules/linked/linked-focus-manager.d.ts +13 -0
  139. package/dist/types/components/molecules/linked/linked.d.ts +3 -0
  140. package/dist/types/components/molecules/number-input/number-input.d.ts +1 -0
  141. package/dist/types/components/molecules/upload/file-upload.component.d.ts +233 -0
  142. package/dist/types/components/molecules/upload/file-upload.style.d.ts +548 -0
  143. package/dist/types/components/organism/list/list-focus-manager.d.ts +53 -0
  144. package/dist/types/components/organism/list/list-key-control.d.ts +1 -0
  145. package/dist/types/components/organism/list/list.d.ts +18 -1
  146. package/dist/types/components/other/toast/toast.d.ts +1 -0
  147. package/dist/types/components.d.ts +417 -1
  148. package/dist/types/templates/list-item-template.d.ts +2 -0
  149. package/dist/types/templates/list-template.d.ts +2 -0
  150. package/package.json +1 -1
  151. package/dist/bromcom-ui/p-16b8a312.entry.js +0 -16
  152. package/dist/bromcom-ui/p-839b6fd5.entry.js +0 -5
  153. package/dist/bromcom-ui/p-be8aa3b8.entry.js +0 -5
  154. package/dist/bromcom-ui/p-d0aa71e1.entry.js +0 -5
  155. package/dist/bromcom-ui/p-df92d838.js +0 -5
  156. package/dist/bromcom-ui/p-dfd73f7c.entry.js +0 -5
@@ -0,0 +1,233 @@
1
+ import { EventEmitter, ComponentInterface } from '../../../stencil-public-runtime';
2
+ export type BcmUploadStatus = 'uploading' | 'uploaded' | 'error';
3
+ export type BcmUploadPosition = 'vertical' | 'horizontal' | 'button';
4
+ export interface BcmUploadItem {
5
+ id: string;
6
+ file: File;
7
+ status: BcmUploadStatus;
8
+ progress?: number;
9
+ }
10
+ export interface BcmUploadErrorMessages {
11
+ /**
12
+ * Error message shown when a file exceeds the maxSize limit.
13
+ */
14
+ maxSize?: string;
15
+ /**
16
+ * Error message shown when file type is not allowed by `accept`.
17
+ */
18
+ type?: string;
19
+ /**
20
+ * Error message shown when `maxFileCount` is exceeded.
21
+ */
22
+ maxFileCount?: string;
23
+ }
24
+ /**
25
+ * @component BcmFileUpload
26
+ * @description A fully featured drag-and-drop file uploader component.
27
+ * Supports form-associated behavior, validation, custom size limits,
28
+ * accepted file type filtering, multiple file selection, progress tracking,
29
+ * upload canceling, file removal, and accessibility events (focus/blur).
30
+ *
31
+ * Upload progress is currently simulated locally. The `uploadUrl` prop
32
+ * is reserved for future real HTTP upload integration and has no effect yet.
33
+ *
34
+ * @example Basic usage
35
+ * <bcm-file-upload name="report" label="Upload Report"></bcm-file-upload>
36
+ *
37
+ * @example Multiple files
38
+ * <bcm-file-upload name="attachments" multiple></bcm-file-upload>
39
+ *
40
+ * @example Custom max size and accepted formats
41
+ * <bcm-file-upload
42
+ * name="medicalFiles"
43
+ * accept=".pdf,.jpg"
44
+ * maxSize={5}
45
+ * ></bcm-file-upload>
46
+ *
47
+ * @prop {string} name
48
+ * The name of the form field used when the component is inside a `<form>`.
49
+ * Supports automatic FormData generation including:
50
+ * - single upload: name="file"
51
+ * - multiple upload: name="file[0], file[1], ..."
52
+ *
53
+ * @prop {string} label
54
+ * Optional label shown above the upload zone.
55
+ *
56
+ * @prop {string} caption
57
+ * Optional helper text rendered below the file list. Example: “Max size 5MB”.
58
+ *
59
+ * @prop {boolean} multiple
60
+ * Allows selecting and uploading multiple files at once.
61
+ *
62
+ * @prop {string} accept
63
+ * Comma-separated list of allowed file extensions.
64
+ * Example: ".pdf,.xls,.png".
65
+ *
66
+ * @prop {number} maxSize
67
+ * Maximum allowed size per file (in MB). If exceeded, an error alert appears.
68
+ *
69
+ * @prop {boolean} required
70
+ * Enables form validation — at least one file must be uploaded.
71
+ * Validation is applied by the surrounding `bcm-form-2` / `bcm-form`
72
+ * component, which reads `required` and `value` and sets the caption error.
73
+ *
74
+ * @prop {boolean} disabled
75
+ * Makes the uploader non-interactive: no clicking, no drag-and-drop.
76
+ *
77
+ * @prop {"medium" | "small"} size
78
+ * Controls spacing, typography, and visual density of the upload zone.
79
+ *
80
+ * @prop {string} uploadUrl
81
+ * Reserved for future backend upload integration.
82
+ * Currently has no effect and does not trigger any HTTP requests.
83
+ *
84
+ * @prop {number} maxFileCount
85
+ * Optional limit for how many files can be selected in total.
86
+ * Only applied when `multiple` is true.
87
+ * If exceeded, new files are ignored and a max-file-count error is shown.
88
+ *
89
+ * @prop {BcmUploadErrorMessages} customErrorMessages
90
+ * Optional override for all error messages:
91
+ * - maxSize: file too large
92
+ * - type: unsupported file type
93
+ * - maxFileCount: too many files selected
94
+ *
95
+ *
96
+ * @event {EventEmitter<File[]>} bcm-file-change
97
+ * Fired whenever the component's internal file list changes.
98
+ * Emits an array of the current File objects.
99
+ *
100
+ * @event {EventEmitter<BcmUploadItem>} bcm-file-removed
101
+ * Fired when the user removes a file from the list.
102
+ *
103
+ * @event {EventEmitter<BcmUploadItem>} bcm-upload-canceled
104
+ * Fired when an upload is canceled before completion.
105
+ *
106
+ * @event {EventEmitter<FocusEvent>} bcm-focus
107
+ * Fired when upload zone receives keyboard or mouse focus.
108
+ *
109
+ * @event {EventEmitter<FocusEvent>} bcm-blur
110
+ * Fired when upload zone loses focus.
111
+ *
112
+ *
113
+ * @csspart upload-zone
114
+ * The root clickable drop area for file selection or drag-and-drop.
115
+ *
116
+ * @csspart file-list
117
+ * The container wrapping rendered file rows.
118
+ *
119
+ * @csspart file-row
120
+ * A single file entry including its name, actions, and progress bar.
121
+ *
122
+ * @csspart remove-btn
123
+ * The remove action button inside uploaded file rows.
124
+ *
125
+ * @csspart cancel-btn
126
+ * The cancel upload button during uploading progress.
127
+ *
128
+ * @csspart download-btn
129
+ * The download button for already uploaded files.
130
+ *
131
+ * @csspart label
132
+ * The external label text displayed above the component.
133
+ *
134
+ * @csspart caption
135
+ * Helper or informative caption displayed below the uploaded list.
136
+ */
137
+ export declare class BcmFileUpload implements ComponentInterface {
138
+ host: HTMLElement;
139
+ private inputId;
140
+ private labelId;
141
+ private fileInput?;
142
+ private uploadTimer?;
143
+ private uploadZoneRef?;
144
+ private uploadButtonRef?;
145
+ name: string;
146
+ label: string;
147
+ caption?: string;
148
+ noCaption: boolean;
149
+ multiple: boolean;
150
+ accept: string;
151
+ maxSize: number;
152
+ required: boolean;
153
+ disabled: boolean;
154
+ size: 'medium' | 'small';
155
+ position: BcmUploadPosition;
156
+ buttonLabel?: string;
157
+ showFileList: boolean;
158
+ fullWidth: boolean;
159
+ /**
160
+ * Reserved for future backend upload integration.
161
+ * Currently does not affect component behavior.
162
+ */
163
+ uploadUrl?: string;
164
+ /**
165
+ * Maximum number of files allowed in total.
166
+ * Only applied when `multiple` is true.
167
+ */
168
+ maxFileCount?: number;
169
+ /**
170
+ * Allows consumers to override default error messages.
171
+ */
172
+ customErrorMessages?: BcmUploadErrorMessages;
173
+ value: any;
174
+ captionError?: string;
175
+ captionType?: string;
176
+ private files;
177
+ private dragActive;
178
+ private zoneHovered;
179
+ private maxSizeError;
180
+ private typeError;
181
+ private maxFileCountError;
182
+ bcmFileChange: EventEmitter<File[]>;
183
+ bcmChange: EventEmitter<any>;
184
+ bcmFileRemoved: EventEmitter<BcmUploadItem>;
185
+ bcmUploadCanceled: EventEmitter<BcmUploadItem>;
186
+ bcmFocus: EventEmitter<FocusEvent>;
187
+ bcmBlur: EventEmitter<FocusEvent>;
188
+ private internalMaxSizeInBytes;
189
+ componentWillLoad(): void;
190
+ private get isButtonMode();
191
+ private get zoneError();
192
+ private getStyleProps;
193
+ disconnectedCallback(): void;
194
+ handleMaxSizeChange(): void;
195
+ /**
196
+ * Normalize and check a file against the `accept` attribute.
197
+ */
198
+ private isFileAccepted;
199
+ private emitChange;
200
+ private normalizeSetDataToItems;
201
+ get(): Promise<any>;
202
+ set(data: any): Promise<void>;
203
+ setClear(): Promise<unknown>;
204
+ resetCaption(): Promise<unknown>;
205
+ /**
206
+ * Simulate upload progress. Replace with real upload logic if needed.
207
+ */
208
+ private startFakeUpload;
209
+ /**
210
+ * Add files from input or drop.
211
+ */
212
+ private addFiles;
213
+ private removeFile;
214
+ private cancelUpload;
215
+ private onFileInputChange;
216
+ private handleDrop;
217
+ private handleDragOver;
218
+ private handleDragLeave;
219
+ private openFileDialog;
220
+ setFocus(options?: FocusOptions): Promise<void>;
221
+ private handleZoneMouseEnter;
222
+ private handleZoneMouseLeave;
223
+ private handleZoneKeyDown;
224
+ private getMaxSizeLabel;
225
+ private handleFocus;
226
+ private handleBlur;
227
+ private renderErrors;
228
+ private renderUploadZone;
229
+ private renderUploadButton;
230
+ private renderHiddenInput;
231
+ private renderFileRow;
232
+ render(): any;
233
+ }