kitunga-web 0.1.97 → 0.1.98

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.
@@ -2,19 +2,37 @@ import React from 'react';
2
2
  export interface Option {
3
3
  value: string;
4
4
  label: string;
5
+ /** Rótulo curto para o trigger fechado (ex.: nome do país sem o
6
+ * indicativo). Default: label. */
5
7
  selectedLabel?: string;
6
8
  disabled?: boolean;
7
9
  /** Ícone da opção (bandeira, avatar, glyph) — renderiza na linha
8
- * do dropdown e, se a opção estiver seleccionada, também no
10
+ * do dropdown/picker e, se a opção estiver seleccionada, também no
9
11
  * trigger fechado (ganha ao leftIcon contextual). */
10
12
  icon?: React.ReactNode;
13
+ /** Texto literal do cabeçalho de secção no modo picker — opções
14
+ * com o mesmo group renderizam sob a mesma secção, na ordem dada
15
+ * (ex.: 'Sugeridos', 'A', 'B'). Sem group, a opção renderiza sem
16
+ * cabeçalho. */
17
+ group?: string;
18
+ }
19
+ export interface PickerClassNames {
20
+ overlay?: string;
21
+ panel?: string;
22
+ header?: string;
23
+ backButton?: string;
24
+ closeButton?: string;
25
+ searchRow?: string;
26
+ list?: string;
27
+ groupHeader?: string;
28
+ option?: string;
11
29
  }
12
30
  export interface CustomSelectProps {
13
31
  id?: string;
14
32
  name?: string;
15
33
  value: string;
16
34
  onChange: (value: string) => void;
17
- options: Option[];
35
+ options?: Option[];
18
36
  placeholder?: string;
19
37
  required?: boolean;
20
38
  className?: string;
@@ -27,12 +45,12 @@ export interface CustomSelectProps {
27
45
  collapsible?: boolean;
28
46
  dropdownMinWidth?: number;
29
47
  dropdownAlign?: 'left' | 'right';
30
- /** SearchInput fixo no topo do dropdown — para listas longas
48
+ /** SearchInput fixo no topo do painel — para listas longas
31
49
  * (ex.: países). Filtro accent-insensitive por label, selectedLabel
32
50
  * e value (o "244" encontra "Angola (+244)"). */
33
51
  searchable?: boolean;
34
52
  searchPlaceholder?: string;
35
- /** Tamanho do SearchInput no dropdown (default 'md'). */
53
+ /** Tamanho do SearchInput no painel (default 'md'). */
36
54
  searchSize?: 'sm' | 'md' | 'lg';
37
55
  /** O empty quando o filtro não encontra nada — o mesmo
38
56
  * SearchEmptyState das tabelas; actionLabel mostra o botão que
@@ -42,6 +60,40 @@ export interface CustomSelectProps {
42
60
  description?: string;
43
61
  actionLabel?: string;
44
62
  };
63
+ /** Segunda apresentação da lista: overlay-sheet com header, pesquisa
64
+ * e secções agrupadas — para listas longas com identidade visual
65
+ * (países, línguas). 'dropdown' é o comportamento de sempre.
66
+ * A pele responsiva é do consumidor via vars --picker-* e
67
+ * pickerClassNames — a kitunga não tem breakpoints. */
68
+ presentation?: 'dropdown' | 'picker';
69
+ /** Título do header do sheet no modo picker. */
70
+ pickerTitle?: string;
71
+ /** Autofocus no SearchInput ao abrir o picker (default false — no
72
+ * mobile abre o teclado; fica ao critério do consumidor). */
73
+ searchAutoFocus?: boolean;
74
+ /** Slots de classe para a pele do consumidor — media queries e
75
+ * regras de breakpoint vivem sempre fora da kitunga. */
76
+ pickerClassNames?: PickerClassNames;
77
+ /** Conveniência que constrói as opções internamente:
78
+ * 'country' → todos os territórios do libphonenumber +
79
+ * Intl.DisplayNames + bandeiras de flagBaseUrl;
80
+ * 'language' → locales + getLanguageLabel + glyph Globe por linha.
81
+ * `options` explícito sempre ganha ao `kind`. */
82
+ kind?: 'country' | 'language';
83
+ /** Locale dos Intl.DisplayNames e da ordenação — a língua activa
84
+ * do consumidor (default 'en'). */
85
+ displayLocale?: string;
86
+ /** Base dos SVGs de bandeira do consumidor (default '/flags/4x3'). */
87
+ flagBaseUrl?: string;
88
+ /** Bloco prioritário no topo do picker (kind='country') — a ordem
89
+ * é do produto; estas opções entram no grupo `suggestedLabel`. */
90
+ priorityCodes?: readonly string[];
91
+ /** Texto do cabeçalho do grupo prioritário (kind='country'). */
92
+ suggestedLabel?: string;
93
+ /** Lista de locales para kind='language' — a whitelist do consumidor. */
94
+ locales?: readonly string[];
95
+ /** Nome da língua por locale — i18n do consumidor. */
96
+ getLanguageLabel?: (locale: string) => string;
45
97
  }
46
98
  declare const CustomSelect: React.FC<CustomSelectProps>;
47
99
  export default CustomSelect;
@@ -1 +1 @@
1
- {"version":3,"file":"CustomSelect.d.ts","sourceRoot":"","sources":["../../../../../src/features/selects/components/Selects/CustomSelect.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAM3D,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;0DAEsD;IACtD,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC;;sDAEkD;IAClD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yDAAyD;IACzD,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAChC;;4BAEwB;IACxB,gBAAgB,CAAC,EAAE;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,QAAA,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAkM7C,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"CustomSelect.d.ts","sourceRoot":"","sources":["../../../../../src/features/selects/components/Selects/CustomSelect.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAUxE,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd;uCACmC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;0DAEsD;IACtD,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB;;;qBAGiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC;;sDAEkD;IAClD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uDAAuD;IACvD,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAChC;;4BAEwB;IACxB,gBAAgB,CAAC,EAAE;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF;;;;4DAIwD;IACxD,YAAY,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IACrC,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;kEAC8D;IAC9D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;6DACyD;IACzD,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;;;sDAIkD;IAClD,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IAC9B;wCACoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;uEACmE;IACnE,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;CAC/C;AAQD,QAAA,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAwX7C,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -1,75 +1,190 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState, useRef, useEffect } from 'react';
4
- import { ChevronDown, Check } from 'lucide-react';
3
+ import React, { useState, useRef, useEffect, useCallback } from 'react';
4
+ import { ChevronDown, Check, X, ArrowLeft } from 'lucide-react';
5
5
  import SearchInput from '../../../inputs/components/Inputs/SearchInput';
6
6
  import SearchEmptyState from '../../../feedback/components/EmptyStates/SearchEmptyState/SearchEmptyState';
7
+ import { buildCountryPickerOptions, buildLanguagePickerOptions, } from './pickerOptions';
7
8
  import styles from './CustomSelect.module.css';
8
- const CustomSelect = ({ id, name, value, onChange, options, placeholder = 'Selecione uma opção', required = false, className = '', disabled = false, leftIcon, hasError = false, variant = 'default', size = 'md', valueBold = false, collapsible = false, dropdownMinWidth, dropdownAlign = 'right', searchable = false, searchPlaceholder, searchSize = 'md', searchEmptyProps, }) => {
9
- var _a, _b;
9
+ const normalize = (text) => text
10
+ .normalize('NFD')
11
+ .replace(/[\u0300-\u036f]/g, '')
12
+ .toLowerCase();
13
+ const CustomSelect = ({ id, name, value, onChange, options, placeholder = 'Selecione uma opção', required = false, className = '', disabled = false, leftIcon, hasError = false, variant = 'default', size = 'md', valueBold = false, collapsible = false, dropdownMinWidth, dropdownAlign = 'right', searchable = false, searchPlaceholder, searchSize = 'md', searchEmptyProps, presentation = 'dropdown', pickerTitle, searchAutoFocus = false, pickerClassNames, kind, displayLocale, flagBaseUrl, priorityCodes, suggestedLabel, locales, getLanguageLabel, }) => {
14
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
10
15
  const [isOpen, setIsOpen] = useState(false);
11
16
  const [search, setSearch] = useState('');
12
17
  const selectRef = useRef(null);
18
+ // Entrada transitória do histórico no modo picker — o voltar do
19
+ // mobile/SO fecha o sheet (mesmo modelo do PopupContext do Masolo,
20
+ // sem router: pushState + popstate).
21
+ const pickerPushedRef = useRef(false);
22
+ const resolvedOptions = React.useMemo(() => {
23
+ if (options === null || options === void 0 ? void 0 : options.length)
24
+ return options;
25
+ if (kind === 'country') {
26
+ return buildCountryPickerOptions({
27
+ displayLocale,
28
+ flagBaseUrl,
29
+ priorityCodes,
30
+ suggestedLabel,
31
+ });
32
+ }
33
+ if (kind === 'language') {
34
+ return buildLanguagePickerOptions({
35
+ locales: locales !== null && locales !== void 0 ? locales : [],
36
+ getLanguageLabel,
37
+ displayLocale,
38
+ });
39
+ }
40
+ return options !== null && options !== void 0 ? options : [];
41
+ }, [
42
+ options,
43
+ kind,
44
+ displayLocale,
45
+ flagBaseUrl,
46
+ priorityCodes,
47
+ suggestedLabel,
48
+ locales,
49
+ getLanguageLabel,
50
+ ]);
13
51
  const selectedOption = value && value.trim() !== ''
14
- ? options.find(option => option.value === value) || null
52
+ ? resolvedOptions.find((option) => option.value === value) || null
15
53
  : null;
16
- // O ícone do trigger: o da opção seleccionada (bandeira do país)
17
- // ganha ao leftIcon contextual (Globe, Funnel…).
18
- const displayIcon = (_a = selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.icon) !== null && _a !== void 0 ? _a : leftIcon;
19
- const normalize = (text) => text.normalize('NFD').replace(/[\u0300-\u036f]/g, '').toLowerCase();
20
- const query = normalize(search.trim());
21
- const visibleOptions = query
22
- ? options.filter((option) => normalize(option.label).includes(query) ||
23
- normalize(option.value).includes(query) ||
24
- (option.selectedLabel ? normalize(option.selectedLabel).includes(query) : false))
25
- : options;
26
- // Ao fechar, a pesquisa morre — o próximo open recomeça limpo
27
- // (o autofocus vem do próprio SearchInput ao montar).
54
+ // Fecha o picker — se a entrada do histórico é nossa, o fecho POPA-a
55
+ // com history.back() (o popstate faz setIsOpen(false)); sem entrada
56
+ // basta o state.
57
+ const closePicker = useCallback(() => {
58
+ if (pickerPushedRef.current) {
59
+ pickerPushedRef.current = false;
60
+ window.history.back();
61
+ return;
62
+ }
63
+ setIsOpen(false);
64
+ }, []);
65
+ // Click fora fecha o painel — mousedown para apanhar antes do blur.
66
+ // No modo picker o overlay cobre o viewport e trata do seu próprio
67
+ // click-outside (está dentro do selectRef, por isso nunca dispara aqui).
68
+ useEffect(() => {
69
+ const handleClickOutside = (event) => {
70
+ if (selectRef.current &&
71
+ !selectRef.current.contains(event.target)) {
72
+ setIsOpen(false);
73
+ }
74
+ };
75
+ document.addEventListener('mousedown', handleClickOutside);
76
+ return () => document.removeEventListener('mousedown', handleClickOutside);
77
+ }, []);
78
+ // A pesquisa morre com o painel — reabrir mostra a lista inteira.
28
79
  useEffect(() => {
29
80
  if (!isOpen)
30
81
  setSearch('');
31
82
  }, [isOpen]);
83
+ // popstate — o voltar do SO/navegador popou a nossa entrada: fecha.
84
+ useEffect(() => {
85
+ if (!isOpen || presentation !== 'picker')
86
+ return;
87
+ const handlePopState = () => {
88
+ pickerPushedRef.current = false;
89
+ setIsOpen(false);
90
+ };
91
+ window.addEventListener('popstate', handlePopState);
92
+ return () => window.removeEventListener('popstate', handlePopState);
93
+ }, [isOpen, presentation]);
94
+ // ESC + trava de scroll da página enquanto o sheet está aberto.
95
+ useEffect(() => {
96
+ if (!isOpen || presentation !== 'picker')
97
+ return;
98
+ const handleKeyDown = (e) => {
99
+ if (e.key === 'Escape')
100
+ closePicker();
101
+ };
102
+ window.addEventListener('keydown', handleKeyDown);
103
+ document.body.style.overflow = 'hidden';
104
+ return () => {
105
+ window.removeEventListener('keydown', handleKeyDown);
106
+ document.body.style.overflow = 'unset';
107
+ };
108
+ }, [isOpen, presentation, closePicker]);
32
109
  const toggleDropdown = () => {
33
110
  if (disabled)
34
111
  return;
35
- setIsOpen(!isOpen);
112
+ if (isOpen) {
113
+ if (presentation === 'picker')
114
+ closePicker();
115
+ else
116
+ setIsOpen(false);
117
+ return;
118
+ }
119
+ setIsOpen(true);
120
+ if (presentation === 'picker' && typeof window !== 'undefined') {
121
+ // Entrada transitória — o botão/gesto de voltar do SO fecha o
122
+ // sheet sem sair da página por baixo.
123
+ pickerPushedRef.current = true;
124
+ window.history.pushState({ __kitungaSelectPicker: true }, '');
125
+ }
36
126
  };
37
127
  const handleSelect = (option) => {
38
128
  if (option.disabled)
39
129
  return;
40
130
  onChange(option.value);
41
- setIsOpen(false);
131
+ if (presentation === 'picker')
132
+ closePicker();
133
+ else
134
+ setIsOpen(false);
42
135
  };
43
- // Fechar o dropdown ao clicar fora
44
- useEffect(() => {
45
- const handleClickOutside = (event) => {
46
- if (selectRef.current && !selectRef.current.contains(event.target)) {
47
- setIsOpen(false);
136
+ const handleKeyDown = (e) => {
137
+ if (e.key === 'Enter' || e.key === ' ') {
138
+ e.preventDefault();
139
+ toggleDropdown();
140
+ }
141
+ };
142
+ const query = normalize(search.trim());
143
+ const visibleOptions = query
144
+ ? resolvedOptions.filter((option) => {
145
+ var _a;
146
+ return normalize(option.label).includes(query) ||
147
+ normalize((_a = option.selectedLabel) !== null && _a !== void 0 ? _a : '').includes(query) ||
148
+ normalize(option.value).includes(query);
149
+ })
150
+ : resolvedOptions;
151
+ const displayIcon = (_a = selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.icon) !== null && _a !== void 0 ? _a : leftIcon;
152
+ const renderOptionRow = (option) => {
153
+ var _a;
154
+ return (_jsxs("div", { className: `${styles.option} ${value === option.value ? styles.selected : ''} ${option.disabled ? styles.disabledOption : ''} ${(_a = pickerClassNames === null || pickerClassNames === void 0 ? void 0 : pickerClassNames.option) !== null && _a !== void 0 ? _a : ''}`, onClick: () => handleSelect(option), onKeyDown: (e) => {
155
+ if (option.disabled)
156
+ return;
157
+ if (e.key === 'Enter' || e.key === ' ') {
158
+ e.preventDefault();
159
+ handleSelect(option);
160
+ }
161
+ }, role: "option", "aria-selected": value === option.value, "aria-disabled": option.disabled ? true : undefined, tabIndex: option.disabled ? -1 : 0, children: [_jsxs("span", { className: styles.optionText, children: [option.icon && (_jsx("span", { className: styles.optionIcon, children: option.icon })), _jsx("span", { children: option.label })] }), value === option.value && (_jsx(Check, { size: 14, className: styles.checkIcon }))] }, option.value));
162
+ };
163
+ // Linhas do picker com cabeçalhos de secção — um header renderiza
164
+ // sempre que o group muda em relação à linha anterior; ao filtrar,
165
+ // os grupos recalculam sobre o resultado.
166
+ const renderPickerRows = () => {
167
+ const rows = [];
168
+ let lastGroup;
169
+ visibleOptions.forEach((option) => {
170
+ var _a;
171
+ if (option.group !== lastGroup) {
172
+ lastGroup = option.group;
173
+ if (option.group) {
174
+ rows.push(_jsx("div", { className: `${styles.pickerGroupHeader} ${(_a = pickerClassNames === null || pickerClassNames === void 0 ? void 0 : pickerClassNames.groupHeader) !== null && _a !== void 0 ? _a : ''}`, children: option.group }, `group-${option.group}`));
175
+ }
48
176
  }
49
- };
50
- document.addEventListener('mousedown', handleClickOutside);
51
- return () => {
52
- document.removeEventListener('mousedown', handleClickOutside);
53
- };
54
- }, []);
55
- return (_jsxs("div", { className: `${styles.customSelect} ${styles[size]} ${variant === 'flat' ? styles.flat : ''} ${className} ${isOpen ? styles.open : ''} ${hasError ? styles.error : ''} ${collapsible ? styles.collapsible : ''}`, ref: selectRef, children: [name && (_jsx("input", { type: "hidden", id: id, name: name, value: value || '', required: required })), _jsxs("div", { className: `${styles.selectedValue} ${disabled ? styles.disabled : ''} ${leftIcon && !(selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.icon) ? styles.hasLeftIcon : ''}`, onClick: toggleDropdown, role: "button", tabIndex: disabled ? -1 : 0, onKeyDown: (e) => {
56
- if (disabled)
57
- return;
58
- if (e.key === 'Enter' || e.key === ' ') {
59
- e.preventDefault();
60
- toggleDropdown();
61
- }
62
- }, children: [(selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.icon) ? (_jsx("span", { className: styles.triggerIconFrame, children: displayIcon })) : (displayIcon && _jsx("span", { className: styles.leftIcon, children: displayIcon })), _jsx("span", { className: `${styles.valueText} ${!value ? styles.placeholder : ''} ${valueBold ? styles.valueBold : ''}`.trim(), children: selectedOption ? (_b = selectedOption.selectedLabel) !== null && _b !== void 0 ? _b : selectedOption.label : placeholder }), _jsx(ChevronDown, { size: 16, className: `${styles.arrow} ${isOpen ? styles.rotate : ''}` })] }), isOpen && (_jsx("div", { className: `${styles.dropdown} ${dropdownAlign === 'left' ? styles.dropdownLeft : styles.dropdownRight}`, style: dropdownMinWidth ? { minWidth: `${dropdownMinWidth}px` } : undefined, children: _jsxs("div", { className: styles.dropdownPanel, children: [searchable && (_jsx("div", { className: styles.searchRow, onClick: (e) => e.stopPropagation(), children: _jsx(SearchInput, { value: search, onChange: setSearch, placeholder: searchPlaceholder !== null && searchPlaceholder !== void 0 ? searchPlaceholder : 'Pesquisar...', size: searchSize, onKeyDown: (e) => {
177
+ rows.push(renderOptionRow(option));
178
+ });
179
+ return rows;
180
+ };
181
+ return (_jsxs("div", { ref: selectRef, className: `${styles.customSelect} ${styles[size]} ${variant === 'flat' ? styles.flat : ''} ${hasError ? styles.error : ''} ${disabled ? styles.disabled : ''} ${isOpen ? styles.open : ''} ${className}`, children: [_jsxs("div", { className: styles.selectedValue, onClick: toggleDropdown, onKeyDown: handleKeyDown, role: "button", tabIndex: disabled ? -1 : 0, "aria-haspopup": "listbox", "aria-expanded": isOpen, children: [displayIcon && (_jsx("span", { className: styles.triggerIconFrame, children: displayIcon })), _jsx("span", { className: `${styles.valueText} ${selectedOption ? styles.filled : ''} ${valueBold && selectedOption ? styles.bold : ''}`, children: (_c = (_b = selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.selectedLabel) !== null && _b !== void 0 ? _b : selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.label) !== null && _c !== void 0 ? _c : placeholder }), _jsx(ChevronDown, { size: 16, className: `${styles.arrowIcon} ${collapsible ? styles.collapsibleArrow : ''}` })] }), isOpen && presentation !== 'picker' && (_jsxs("div", { className: `${styles.dropdown} ${styles[dropdownAlign]}`, style: dropdownMinWidth ? { minWidth: `${dropdownMinWidth}px` } : undefined, children: [searchable && (_jsx("div", { className: styles.searchRow, onClick: (e) => e.stopPropagation(), children: _jsx(SearchInput, { value: search, onChange: setSearch, placeholder: searchPlaceholder !== null && searchPlaceholder !== void 0 ? searchPlaceholder : 'Pesquisar...', size: searchSize, onKeyDown: (e) => {
182
+ if (e.key === 'Enter')
183
+ e.preventDefault();
184
+ } }) })), _jsxs("div", { className: styles.options, role: "listbox", onClick: (e) => e.stopPropagation(), children: [visibleOptions.map(renderOptionRow), visibleOptions.length === 0 && (_jsx(SearchEmptyState, { title: searchEmptyProps === null || searchEmptyProps === void 0 ? void 0 : searchEmptyProps.title, description: searchEmptyProps === null || searchEmptyProps === void 0 ? void 0 : searchEmptyProps.description, actionLabel: searchEmptyProps === null || searchEmptyProps === void 0 ? void 0 : searchEmptyProps.actionLabel, onAction: () => setSearch('') }))] })] })), isOpen && presentation === 'picker' && (_jsx("div", { className: `${styles.pickerOverlay} ${(_d = pickerClassNames === null || pickerClassNames === void 0 ? void 0 : pickerClassNames.overlay) !== null && _d !== void 0 ? _d : ''}`, onClick: closePicker, role: "dialog", "aria-modal": "true", "aria-label": pickerTitle, children: _jsxs("div", { className: `${styles.pickerPanel} ${(_e = pickerClassNames === null || pickerClassNames === void 0 ? void 0 : pickerClassNames.panel) !== null && _e !== void 0 ? _e : ''}`, onClick: (e) => e.stopPropagation(), children: [_jsxs("div", { className: `${styles.pickerHeader} ${(_f = pickerClassNames === null || pickerClassNames === void 0 ? void 0 : pickerClassNames.header) !== null && _f !== void 0 ? _f : ''}`, children: [_jsx("button", { type: "button", className: `${styles.pickerBack} ${(_g = pickerClassNames === null || pickerClassNames === void 0 ? void 0 : pickerClassNames.backButton) !== null && _g !== void 0 ? _g : ''}`, onClick: closePicker, "aria-label": "Back", children: _jsx(ArrowLeft, { size: 24 }) }), _jsx("h2", { className: styles.pickerTitle, children: pickerTitle }), _jsx("button", { type: "button", className: `${styles.pickerClose} ${(_h = pickerClassNames === null || pickerClassNames === void 0 ? void 0 : pickerClassNames.closeButton) !== null && _h !== void 0 ? _h : ''}`, onClick: closePicker, "aria-label": "Close", children: _jsx(X, { size: 24 }) })] }), searchable && (_jsx("div", { className: `${styles.pickerSearch} ${(_j = pickerClassNames === null || pickerClassNames === void 0 ? void 0 : pickerClassNames.searchRow) !== null && _j !== void 0 ? _j : ''}`, children: _jsx(SearchInput, { value: search, onChange: setSearch, placeholder: searchPlaceholder !== null && searchPlaceholder !== void 0 ? searchPlaceholder : 'Pesquisar...', size: searchSize, autoFocus: searchAutoFocus, onKeyDown: (e) => {
63
185
  if (e.key === 'Enter')
64
186
  e.preventDefault();
65
- } }) })), _jsxs("div", { className: styles.dropdownList, role: "listbox", children: [visibleOptions.map((option) => (_jsxs("div", { className: `${styles.option} ${value === option.value ? styles.selected : ''} ${option.disabled ? styles.disabledOption : ''}`, onClick: () => handleSelect(option), onKeyDown: (e) => {
66
- if (option.disabled)
67
- return;
68
- if (e.key === 'Enter' || e.key === ' ') {
69
- e.preventDefault();
70
- handleSelect(option);
71
- }
72
- }, role: "option", "aria-selected": value === option.value, "aria-disabled": option.disabled ? true : undefined, tabIndex: option.disabled ? -1 : 0, children: [_jsxs("span", { className: styles.optionText, children: [option.icon && (_jsx("span", { className: styles.optionIcon, children: option.icon })), _jsx("span", { children: option.label })] }), value === option.value && (_jsx(Check, { size: 14, className: styles.checkIcon }))] }, option.value))), visibleOptions.length === 0 && (_jsx(SearchEmptyState, { title: searchEmptyProps === null || searchEmptyProps === void 0 ? void 0 : searchEmptyProps.title, description: searchEmptyProps === null || searchEmptyProps === void 0 ? void 0 : searchEmptyProps.description, actionLabel: searchEmptyProps === null || searchEmptyProps === void 0 ? void 0 : searchEmptyProps.actionLabel, onAction: () => setSearch('') }))] })] }) }))] }));
187
+ } }) })), _jsxs("div", { className: `${styles.pickerList} ${(_k = pickerClassNames === null || pickerClassNames === void 0 ? void 0 : pickerClassNames.list) !== null && _k !== void 0 ? _k : ''}`, role: "listbox", children: [renderPickerRows(), visibleOptions.length === 0 && (_jsx(SearchEmptyState, { title: searchEmptyProps === null || searchEmptyProps === void 0 ? void 0 : searchEmptyProps.title, description: searchEmptyProps === null || searchEmptyProps === void 0 ? void 0 : searchEmptyProps.description, actionLabel: searchEmptyProps === null || searchEmptyProps === void 0 ? void 0 : searchEmptyProps.actionLabel, onAction: () => setSearch('') }))] })] }) })), _jsx("input", { type: "hidden", id: id, name: name, value: value, required: required })] }));
73
188
  };
74
189
  export default CustomSelect;
75
190
  //# sourceMappingURL=CustomSelect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CustomSelect.js","sourceRoot":"","sources":["../../../../../src/features/selects/components/Selects/CustomSelect.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,WAAW,MAAM,+CAA+C,CAAC;AACxE,OAAO,gBAAgB,MAAM,4EAA4E,CAAC;AAC1G,OAAO,MAAM,MAAM,2BAA2B,CAAC;AAgD/C,MAAM,YAAY,GAAgC,CAAC,EACjD,EAAE,EACF,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,OAAO,EACP,WAAW,GAAG,qBAAqB,EACnC,QAAQ,GAAG,KAAK,EAChB,SAAS,GAAG,EAAE,EACd,QAAQ,GAAG,KAAK,EAChB,QAAQ,EACR,QAAQ,GAAG,KAAK,EAChB,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,IAAI,EACX,SAAS,GAAG,KAAK,EACjB,WAAW,GAAG,KAAK,EACnB,gBAAgB,EAChB,aAAa,GAAG,OAAO,EACvB,UAAU,GAAG,KAAK,EAClB,iBAAiB,EACjB,UAAU,GAAG,IAAI,EACjB,gBAAgB,GACjB,EAAE,EAAE;;IACH,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE/C,MAAM,cAAc,GAAG,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QACjD,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,IAAI;QACxD,CAAC,CAAC,IAAI,CAAC;IAET,iEAAiE;IACjE,iDAAiD;IACjD,MAAM,WAAW,GAAG,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,mCAAI,QAAQ,CAAC;IAErD,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CACjC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAEtE,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,KAAK;QAC1B,CAAC,CAAC,OAAO,CAAC,MAAM,CACZ,CAAC,MAAM,EAAE,EAAE,CACT,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CACnF;QACH,CAAC,CAAC,OAAO,CAAC;IAEZ,8DAA8D;IAC9D,sDAAsD;IACtD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,IAAI,QAAQ;YAAE,OAAO;QACrB,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,MAAc,EAAE,EAAE;QACtC,IAAI,MAAM,CAAC,QAAQ;YAAE,OAAO;QAC5B,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,SAAS,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,mCAAmC;IACnC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,kBAAkB,GAAG,CAAC,KAAiB,EAAE,EAAE;YAC/C,IAAI,SAAS,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,EAAE,CAAC;gBAC3E,SAAS,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAC3D,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAChE,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAGP,OAAO,CACL,eACE,SAAS,EAAE,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,EAC/M,GAAG,EAAE,SAAS,aAEb,IAAI,IAAI,CACP,gBACE,IAAI,EAAC,QAAQ,EACb,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,IAAI,EAAE,EAClB,QAAQ,EAAE,QAAQ,GAClB,CACH,EAED,eACE,SAAS,EAAE,GAAG,MAAM,CAAC,aAAa,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,QAAQ,IAAI,CAAC,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,CAAA,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,EACtI,OAAO,EAAE,cAAc,EACvB,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC3B,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;oBACf,IAAI,QAAQ;wBAAE,OAAO;oBACrB,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;wBACvC,CAAC,CAAC,cAAc,EAAE,CAAC;wBACnB,cAAc,EAAE,CAAC;oBACnB,CAAC;gBACH,CAAC,aAKA,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,EAAC,CAAC,CAAC,CACtB,eAAM,SAAS,EAAE,MAAM,CAAC,gBAAgB,YAAG,WAAW,GAAQ,CAC/D,CAAC,CAAC,CAAC,CACF,WAAW,IAAI,eAAM,SAAS,EAAE,MAAM,CAAC,QAAQ,YAAG,WAAW,GAAQ,CACtE,EACD,eACE,SAAS,EAAE,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EACnG,EAAE,CAAC,IAAI,EAAE,YAEV,cAAc,CAAC,CAAC,CAAC,MAAA,cAAc,CAAC,aAAa,mCAAI,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,GAC/E,EACP,KAAC,WAAW,IACV,IAAI,EAAE,EAAE,EACR,SAAS,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,GAC3D,IACE,EAEL,MAAM,IAAI,CACT,cACE,SAAS,EAAE,GAAG,MAAM,CAAC,QAAQ,IAAI,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,EACxG,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,gBAAgB,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,YAE3E,eAAK,SAAS,EAAE,MAAM,CAAC,aAAa,aAIjC,UAAU,IAAI,CACb,cAAK,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,YACnE,KAAC,WAAW,IACV,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,SAAS,EACnB,WAAW,EAAE,iBAAiB,aAAjB,iBAAiB,cAAjB,iBAAiB,GAAI,cAAc,EAChD,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;oCACf,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;wCAAE,CAAC,CAAC,cAAc,EAAE,CAAC;gCAC5C,CAAC,GACD,GACE,CACP,EACD,eAAK,SAAS,EAAE,MAAM,CAAC,YAAY,EAAE,IAAI,EAAC,SAAS,aAChD,cAAc,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC9B,eAEE,SAAS,EAAE,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EACxE,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,EACpD,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,EACnC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;wCACf,IAAI,MAAM,CAAC,QAAQ;4CAAE,OAAO;wCAC5B,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;4CACvC,CAAC,CAAC,cAAc,EAAE,CAAC;4CACnB,YAAY,CAAC,MAAM,CAAC,CAAC;wCACvB,CAAC;oCACH,CAAC,EACD,IAAI,EAAC,QAAQ,mBACE,KAAK,KAAK,MAAM,CAAC,KAAK,mBACtB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EACjD,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAElC,gBAAM,SAAS,EAAE,MAAM,CAAC,UAAU,aAC/B,MAAM,CAAC,IAAI,IAAI,CACd,eAAM,SAAS,EAAE,MAAM,CAAC,UAAU,YAAG,MAAM,CAAC,IAAI,GAAQ,CACzD,EACD,yBAAO,MAAM,CAAC,KAAK,GAAQ,IACtB,EACN,KAAK,KAAK,MAAM,CAAC,KAAK,IAAI,CACzB,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,GAAI,CACjD,KAxBI,MAAM,CAAC,KAAK,CAyBb,CACP,CAAC,EACD,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,CAC9B,KAAC,gBAAgB,IACf,KAAK,EAAE,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,KAAK,EAC9B,WAAW,EAAE,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,WAAW,EAC1C,WAAW,EAAE,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,WAAW,EAC1C,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,GAC7B,CACH,IACG,IACF,GACF,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"CustomSelect.js","sourceRoot":"","sources":["../../../../../src/features/selects/components/Selects/CustomSelect.tsx"],"names":[],"mappings":"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"}
@@ -424,3 +424,133 @@
424
424
  }
425
425
  }
426
426
 
427
+ /* ===== Picker (presentation="picker") — overlay-sheet com header,
428
+ pesquisa e secções agrupadas, para listas longas (países, línguas).
429
+ ZERO breakpoints: a pele responsiva é sempre CSS do consumidor via
430
+ vars --picker-* e pickerClassNames — a kitunga não conhece a regra
431
+ dos 600px do Masolo nem a de nenhum outro produto (decisão 75). */
432
+
433
+ .pickerOverlay {
434
+ position: fixed;
435
+ inset: 0;
436
+ z-index: var(--picker-overlay-z, 1300);
437
+ display: flex;
438
+ align-items: center;
439
+ justify-content: center;
440
+ height: 100dvh;
441
+ padding: var(--picker-overlay-padding, var(--spacing-lg));
442
+ background: var(--picker-overlay-bg, rgba(0, 0, 0, 0.5));
443
+ animation: pickerFadeIn 0.15s ease-out;
444
+ }
445
+
446
+ .pickerPanel {
447
+ display: flex;
448
+ flex-direction: column;
449
+ overflow: hidden;
450
+ width: var(--picker-panel-width, 100%);
451
+ max-width: var(--picker-panel-max-width, 480px);
452
+ height: var(--picker-panel-height, 600px);
453
+ max-height: var(--picker-panel-max-height, 100%);
454
+ background: var(--picker-panel-bg, var(--bg-primary));
455
+ border-radius: var(--picker-panel-radius, var(--radius-sm));
456
+ box-shadow: var(--picker-panel-shadow, 0 10px 25px rgba(0, 0, 0, 0.2));
457
+ }
458
+
459
+ .pickerHeader {
460
+ display: flex;
461
+ align-items: center;
462
+ gap: var(--spacing-md);
463
+ padding: var(--spacing-md);
464
+ flex-shrink: 0;
465
+ }
466
+
467
+ .pickerTitle {
468
+ flex: 1;
469
+ min-width: 0;
470
+ margin: 0;
471
+ font-size: 18px;
472
+ font-weight: 600;
473
+ color: var(--text-primary);
474
+ overflow: hidden;
475
+ text-overflow: ellipsis;
476
+ white-space: nowrap;
477
+ }
478
+
479
+ .pickerBack,
480
+ .pickerClose {
481
+ align-items: center;
482
+ justify-content: center;
483
+ width: 40px;
484
+ height: 40px;
485
+ padding: 0;
486
+ border: none;
487
+ border-radius: 50%;
488
+ background: var(--picker-button-bg, var(--bg-hover-normal));
489
+ color: var(--picker-button-color, var(--text-primary));
490
+ cursor: pointer;
491
+ flex-shrink: 0;
492
+ transition: background-color var(--transition-fast);
493
+ }
494
+
495
+ .pickerBack:hover,
496
+ .pickerClose:hover {
497
+ background-color: var(--picker-button-hover, var(--color-gray-200));
498
+ }
499
+
500
+ /* Visibilidade dos controlos — sempre CSS do consumidor. No Masolo
501
+ o X morre e o ← nasce no takeover ≤600px, via --picker-back-display
502
+ e --picker-close-display num media query do app. Ambos são "close":
503
+ o ← é voltar na forma, fechar na função (decisão 30). */
504
+ .pickerBack {
505
+ display: var(--picker-back-display, none);
506
+ }
507
+
508
+ .pickerClose {
509
+ display: var(--picker-close-display, flex);
510
+ }
511
+
512
+ .pickerSearch {
513
+ padding: 0 var(--picker-search-padding-x, var(--spacing-md)) var(--picker-search-padding-y, var(--spacing-sm-large));
514
+ border-bottom: 1px solid var(--picker-search-border, var(--border-divider));
515
+ flex-shrink: 0;
516
+ }
517
+
518
+ .pickerList {
519
+ flex: 1;
520
+ min-height: 0;
521
+ overflow-y: auto;
522
+ padding: var(--picker-list-padding, var(--spacing-sm) 0);
523
+ }
524
+
525
+ .pickerGroupHeader {
526
+ position: sticky;
527
+ top: 0;
528
+ z-index: 1;
529
+ padding: var(--spacing-sm) var(--picker-group-padding-x, var(--spacing-md));
530
+ font-size: var(--picker-group-size, 0.75rem);
531
+ font-weight: 600;
532
+ letter-spacing: 0.04em;
533
+ text-transform: uppercase;
534
+ color: var(--picker-group-color, var(--text-tertiary));
535
+ background: var(--picker-panel-bg, var(--bg-primary));
536
+ }
537
+
538
+ /* Fallback da flag quando o asset falha — o ISO em texto dentro da
539
+ moldura circular (um consumidor com flagBaseUrl parcial nunca
540
+ mostra imagem partida). */
541
+ .flagFallback {
542
+ font-size: 0.55rem;
543
+ font-weight: 700;
544
+ letter-spacing: 0.02em;
545
+ color: var(--text-tertiary);
546
+ }
547
+
548
+ @keyframes pickerFadeIn {
549
+ from {
550
+ opacity: 0;
551
+ }
552
+ to {
553
+ opacity: 1;
554
+ }
555
+ }
556
+
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+ import type { Option } from './CustomSelect';
3
+ export interface CountryPickerOptionsParams {
4
+ /** Locale dos nomes e da ordenação alfabética (Intl.DisplayNames +
5
+ * localeCompare) — a língua activa do consumidor. */
6
+ displayLocale?: string;
7
+ /** Base dos SVGs de bandeira (default '/flags/4x3') — assets do app
8
+ * consumidor, nunca bundle nem emoji. */
9
+ flagBaseUrl?: string;
10
+ /** Bloco prioritário no topo — a ordem é do produto; estas opções
11
+ * entram no grupo `suggestedLabel` e o resto segue alfabético. */
12
+ priorityCodes?: readonly string[];
13
+ /** Texto do cabeçalho do grupo prioritário (i18n do consumidor). */
14
+ suggestedLabel?: string;
15
+ }
16
+ export declare const buildCountryPickerOptions: ({ displayLocale, flagBaseUrl, priorityCodes, suggestedLabel, }: CountryPickerOptionsParams) => Option[];
17
+ export interface LanguagePickerOptionsParams {
18
+ /** Lista de locales servidos — a whitelist do consumidor. */
19
+ locales: readonly string[];
20
+ /** Nome da língua por locale — i18n do consumidor (a kitunga não
21
+ * conhece os namespaces dele). */
22
+ getLanguageLabel?: (locale: string) => string;
23
+ /** Locale de ordenação alfabética (default: a ordem dada). */
24
+ displayLocale?: string;
25
+ /** Ícone por linha — default o glyph Globe (língua ≠ país). */
26
+ languageIcon?: React.ReactNode;
27
+ }
28
+ export declare const buildLanguagePickerOptions: ({ locales, getLanguageLabel, displayLocale, languageIcon, }: LanguagePickerOptionsParams) => Option[];
29
+ //# sourceMappingURL=pickerOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickerOptions.d.ts","sourceRoot":"","sources":["../../../../../src/features/selects/components/Selects/pickerOptions.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAIxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAoC7C,MAAM,WAAW,0BAA0B;IACzC;0DACsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;8CAC0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;uEACmE;IACnE,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD,eAAO,MAAM,yBAAyB,GAAI,gEAKvC,0BAA0B,KAAG,MAAM,EAmCrC,CAAC;AAEF,MAAM,WAAW,2BAA2B;IAC1C,6DAA6D;IAC7D,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B;uCACmC;IACnC,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAChC;AAED,eAAO,MAAM,0BAA0B,GAAI,6DAKxC,2BAA2B,KAAG,MAAM,EAStC,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // Opções prontas para o modo picker do CustomSelect — kind='country'
3
+ // (todos os territórios da metadata do libphonenumber + Intl.DisplayNames
4
+ // + bandeiras do consumidor) e kind='language' (locales + labels do
5
+ // consumidor + glyph Globe — língua ≠ país, nunca bandeira).
6
+ // A lista de países é a metadata inteira — nunca allowlist manual
7
+ // (decisão 74 do Masolo); o bloco prioritário e a pele são do
8
+ // consumidor via props.
9
+ import { useState } from 'react';
10
+ import { Globe } from 'lucide-react';
11
+ import { getCountryConfig, getSupportedCountryCodes } from '../../../inputs/components/Inputs/PhoneInput/countries';
12
+ import styles from './CustomSelect.module.css';
13
+ const normalize = (text) => text.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
14
+ // Letra do grupo alfabético — NFD para "África"→A, "É…"→E, "Å…"→A.
15
+ const firstLetter = (text) => (normalize(text).charAt(0) || '#').toUpperCase();
16
+ // Flag <img> — se o asset falhar (consumidor com flagBaseUrl parcial)
17
+ // cai para o ISO em texto dentro da mesma moldura circular; nunca
18
+ // imagem partida.
19
+ const FlagImg = ({ code, base }) => {
20
+ const [failed, setFailed] = useState(false);
21
+ if (failed)
22
+ return _jsx("span", { className: styles.flagFallback, children: code });
23
+ return (
24
+ // eslint-disable-next-line @next/next/no-img-element
25
+ _jsx("img", { src: `${base}/${code.toLowerCase()}.svg`, alt: "", loading: "lazy", draggable: false, onError: () => setFailed(true) }));
26
+ };
27
+ const regionNamesCache = new Map();
28
+ const regionNames = (locale) => {
29
+ let names = regionNamesCache.get(locale);
30
+ if (!names) {
31
+ names = new Intl.DisplayNames([locale], { type: 'region' });
32
+ regionNamesCache.set(locale, names);
33
+ }
34
+ return names;
35
+ };
36
+ // Uma lista por combinação de params — os nomes e a ordem mudam com a
37
+ // língua; cacheada porque são ~245 opções.
38
+ const countryCache = new Map();
39
+ export const buildCountryPickerOptions = ({ displayLocale = 'en', flagBaseUrl = '/flags/4x3', priorityCodes = [], suggestedLabel = 'Suggested', }) => {
40
+ const cacheKey = [displayLocale, flagBaseUrl, suggestedLabel, ...priorityCodes].join('|');
41
+ const cached = countryCache.get(cacheKey);
42
+ if (cached)
43
+ return cached;
44
+ const names = regionNames(displayLocale);
45
+ const all = getSupportedCountryCodes();
46
+ const priority = priorityCodes.filter((code) => all.includes(code));
47
+ const prioritySet = new Set(priority);
48
+ const rest = all
49
+ .filter((code) => !prioritySet.has(code))
50
+ .sort((a, b) => { var _a, _b; return ((_a = names.of(a)) !== null && _a !== void 0 ? _a : a).localeCompare((_b = names.of(b)) !== null && _b !== void 0 ? _b : b, displayLocale); });
51
+ const toOption = (code, group) => {
52
+ var _a, _b, _c;
53
+ const name = (_a = names.of(code)) !== null && _a !== void 0 ? _a : code;
54
+ const dialCode = (_c = (_b = getCountryConfig(code)) === null || _b === void 0 ? void 0 : _b.dialCode) !== null && _c !== void 0 ? _c : '';
55
+ return {
56
+ value: code,
57
+ // A linha mostra nome + indicativo (a pesquisa casa os dois);
58
+ // o trigger fechado mostra só o nome via selectedLabel.
59
+ label: dialCode ? `${name} (${dialCode})` : name,
60
+ selectedLabel: name,
61
+ icon: _jsx(FlagImg, { code: code, base: flagBaseUrl }),
62
+ group,
63
+ };
64
+ };
65
+ const result = [
66
+ ...priority.map((code) => toOption(code, suggestedLabel)),
67
+ ...rest.map((code) => { var _a; return toOption(code, firstLetter((_a = names.of(code)) !== null && _a !== void 0 ? _a : code)); }),
68
+ ];
69
+ countryCache.set(cacheKey, result);
70
+ return result;
71
+ };
72
+ export const buildLanguagePickerOptions = ({ locales, getLanguageLabel, displayLocale, languageIcon, }) => {
73
+ const icon = languageIcon !== null && languageIcon !== void 0 ? languageIcon : _jsx(Globe, { size: 18 });
74
+ return locales
75
+ .map((locale) => {
76
+ var _a;
77
+ return ({
78
+ value: locale,
79
+ label: (_a = getLanguageLabel === null || getLanguageLabel === void 0 ? void 0 : getLanguageLabel(locale)) !== null && _a !== void 0 ? _a : locale,
80
+ });
81
+ })
82
+ .sort((a, b) => a.label.localeCompare(b.label, displayLocale))
83
+ .map((option) => (Object.assign(Object.assign({}, option), { icon, group: firstLetter(option.label) })));
84
+ };
85
+ //# sourceMappingURL=pickerOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickerOptions.js","sourceRoot":"","sources":["../../../../../src/features/selects/components/Selects/pickerOptions.tsx"],"names":[],"mappings":";AAAA,qEAAqE;AACrE,0EAA0E;AAC1E,oEAAoE;AACpE,6DAA6D;AAC7D,kEAAkE;AAClE,8DAA8D;AAC9D,wBAAwB;AAExB,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,wDAAwD,CAAC;AACpH,OAAO,MAAM,MAAM,2BAA2B,CAAC;AAG/C,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CACjC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAExD,mEAAmE;AACnE,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AAEvF,sEAAsE;AACtE,kEAAkE;AAClE,kBAAkB;AAClB,MAAM,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAkC,EAAE,EAAE;IACjE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,MAAM;QAAE,OAAO,eAAM,SAAS,EAAE,MAAM,CAAC,YAAY,YAAG,IAAI,GAAQ,CAAC;IACvE,OAAO;IACL,qDAAqD;IACrD,cACE,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,MAAM,EACxC,GAAG,EAAC,EAAE,EACN,OAAO,EAAC,MAAM,EACd,SAAS,EAAE,KAAK,EAChB,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAC9B,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA6B,CAAC;AAC9D,MAAM,WAAW,GAAG,CAAC,MAAc,EAAqB,EAAE;IACxD,IAAI,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5D,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAgBF,sEAAsE;AACtE,2CAA2C;AAC3C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,EACxC,aAAa,GAAG,IAAI,EACpB,WAAW,GAAG,YAAY,EAC1B,aAAa,GAAG,EAAE,EAClB,cAAc,GAAG,WAAW,GACD,EAAY,EAAE;IACzC,MAAM,QAAQ,GAAG,CAAC,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;IACzC,MAAM,GAAG,GAAsB,wBAAwB,EAAE,CAAC;IAC1D,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS,QAAQ,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,GAAG;SACb,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SACxC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,eACb,OAAA,CAAC,MAAA,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,mCAAI,CAAC,CAAC,CAAC,aAAa,CAAC,MAAA,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,mCAAI,CAAC,EAAE,aAAa,CAAC,CAAA,EAAA,CAClE,CAAC;IAEJ,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,KAAa,EAAU,EAAE;;QACvD,MAAM,IAAI,GAAG,MAAA,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,mCAAI,IAAI,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAA,MAAA,gBAAgB,CAAC,IAAI,CAAC,0CAAE,QAAQ,mCAAI,EAAE,CAAC;QACxD,OAAO;YACL,KAAK,EAAE,IAAI;YACX,8DAA8D;YAC9D,wDAAwD;YACxD,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI;YAChD,aAAa,EAAE,IAAI;YACnB,IAAI,EAAE,KAAC,OAAO,IAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,GAAI;YAChD,KAAK;SACN,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG;QACb,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACzD,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,WAAC,OAAA,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,MAAA,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,mCAAI,IAAI,CAAC,CAAC,CAAA,EAAA,CAAC;KAC3E,CAAC;IACF,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAcF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,EACzC,OAAO,EACP,gBAAgB,EAChB,aAAa,EACb,YAAY,GACgB,EAAY,EAAE;IAC1C,MAAM,IAAI,GAAG,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC;IACjD,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;;QAAC,OAAA,CAAC;YAChB,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAG,MAAM,CAAC,mCAAI,MAAM;SAC5C,CAAC,CAAA;KAAA,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;SAC7D,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,iCAAM,MAAM,KAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,IAAG,CAAC,CAAC;AAC9E,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kitunga-web",
3
- "version": "0.1.97",
3
+ "version": "0.1.98",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "repository": {
@@ -63,6 +63,7 @@
63
63
  "babel-plugin-react-compiler": "1.0.0",
64
64
  "eslint": "^9",
65
65
  "eslint-config-next": "16.1.3",
66
+ "flag-icons": "^7.6.0",
66
67
  "typescript": "^5"
67
68
  },
68
69
  "peerDependencies": {
@@ -71,9 +72,9 @@
71
72
  "react-dom": ">=18"
72
73
  },
73
74
  "scripts": {
74
- "dev": "dotenv -e .env.local next dev",
75
+ "dev": "node scripts/copy-flags.mjs && dotenv -e .env.local next dev",
75
76
  "start": "dotenv -e .env.local next start",
76
- "build": "next build",
77
+ "build": "node scripts/copy-flags.mjs && next build",
77
78
  "build:lib": "node ./scripts/build-library.mjs",
78
79
  "publish:lib": "pnpm publish --no-git-checks",
79
80
  "lint": "eslint"