forlogic-core 1.15.8 → 1.16.1

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 (193) hide show
  1. package/.note/memory/components/action-button-for-tables.md +23 -0
  2. package/.note/memory/components/alertdialog-permanent-deletion.md +47 -0
  3. package/.note/memory/components/baseform-custom-fields.md +60 -0
  4. package/.note/memory/components/baseform-usage.md +43 -0
  5. package/.note/memory/components/delete-confirmation-dialog.md +48 -0
  6. package/.note/memory/components/dialog-sizes-and-structure.md +31 -0
  7. package/.note/memory/components/dialog-variants.md +44 -0
  8. package/.note/memory/components/pagination-usage.md +28 -0
  9. package/.note/memory/documentation/consolidated-components-registry.md +18 -0
  10. package/.note/memory/features/crud-standardized-config-props.md +3 -0
  11. package/.note/memory/features/import/attachment-strategy.md +18 -0
  12. package/.note/memory/patterns/body-content-scroll-usage.md +59 -0
  13. package/.note/memory/patterns/crud-action-bar-3-zone-layout.md +3 -0
  14. package/.note/memory/patterns/crud-bulk-actions-dropdown-standard.md +3 -0
  15. package/.note/memory/patterns/crud-toolbar-layout.md +26 -0
  16. package/.note/memory/patterns/dialog-body-scroll-pattern.md +27 -0
  17. package/.note/memory/patterns/single-scroll-pattern.md +22 -0
  18. package/.note/memory/patterns/spa-navigation-pattern.md +19 -0
  19. package/.note/memory/rules/no-auto-index-rule.md +20 -0
  20. package/.note/memory/rules/no-delete-policy-rule.md +23 -0
  21. package/.note/memory/rules/no-env-modification-rule.md +19 -0
  22. package/.note/memory/rules/supabase-schema-rule.md +19 -0
  23. package/README.md +8 -4
  24. package/dist/README.md +7 -4
  25. package/dist/assets/AccordionDoc-BnfxyOi9.js +31 -0
  26. package/dist/assets/ActionButtonDoc-b4F_J8gn.js +47 -0
  27. package/dist/assets/AlertDoc-PkiHguSJ.js +37 -0
  28. package/dist/assets/AppHeaderDoc-CsFMZGV0.js +67 -0
  29. package/dist/assets/AppSidebarDoc-Bg71N-zq.js +196 -0
  30. package/dist/assets/AuthDoc-DDm57y_J.js +192 -0
  31. package/dist/assets/AvatarDoc-C6wiZIZR.js +11 -0
  32. package/dist/assets/BadgeDoc-Bsg7cfm0.js +36 -0
  33. package/dist/assets/BaseFormDoc-DeIlV273.js +169 -0
  34. package/dist/assets/BodyContentDoc-Q3DGvyN9.js +83 -0
  35. package/dist/assets/BreadcrumbDoc-ChsVFjMF.js +75 -0
  36. package/dist/assets/ButtonDoc-C7Q31Bh3.js +41 -0
  37. package/dist/assets/ButtonGroupDoc-Bn5vhjBq.js +7 -0
  38. package/dist/assets/CalendarDoc-iVjNyxyr.js +81 -0
  39. package/dist/assets/CardDoc-D511dll7.js +49 -0
  40. package/dist/assets/ChartDoc-CQyYOEHL.js +111 -0
  41. package/dist/assets/CheckboxDoc-Cjsy4XAq.js +55 -0
  42. package/dist/assets/ColorPickerDoc-hnYJUWpF.js +10 -0
  43. package/dist/assets/ColorsFoundationDoc-B8Z4tAyZ.js +13 -0
  44. package/dist/assets/ComboTreeDoc-ChEbW4a3.js +21 -0
  45. package/dist/assets/ComboboxDoc-CHWeGE_F.js +134 -0
  46. package/dist/assets/ComponentDocTemplate-BtOCnlM2.js +1 -0
  47. package/dist/assets/ContextMenuDoc-C3mFO_Yx.js +182 -0
  48. package/dist/assets/ContextsDoc-ChEbQxom.js +184 -0
  49. package/dist/assets/CreateCrudPageDoc-C9tXisCF.js +106 -0
  50. package/dist/assets/CrudActionBarDoc-Cp1L4gpO.js +112 -0
  51. package/dist/assets/CrudGridDoc-D-kSFBAQ.js +85 -0
  52. package/dist/assets/CrudOverviewDoc-CeLBwg-B.js +14 -0
  53. package/dist/assets/CrudPrimitivesDoc-B2u1vZog.js +164 -0
  54. package/dist/assets/CrudTableDoc-CvV-II_X.js +95 -0
  55. package/dist/assets/DataListDoc-BLRii0jB.js +13 -0
  56. package/dist/assets/DesignSystemHome-TE0Ubaup.js +1 -0
  57. package/dist/assets/DialogDoc--LC5Jvat.js +981 -0
  58. package/dist/assets/DropdownMenuDoc-oPlEriRY.js +175 -0
  59. package/dist/assets/EmptyStateDoc-rNqfWKok.js +35 -0
  60. package/dist/assets/EnvironmentsDoc-CT7l5s2u.js +96 -0
  61. package/dist/assets/ErrorBoundaryDoc-rPHOUygA.js +111 -0
  62. package/dist/assets/ExampleCard-DfuMYM6E.js +1 -0
  63. package/dist/assets/FormDoc-B0L_QaCT.js +81 -0
  64. package/dist/assets/FoundationOverview-Dbb8rBsU.js +1 -0
  65. package/dist/assets/GridDoc-ifcGA2Yw.js +28 -0
  66. package/dist/assets/HooksDoc-CUOT_3Du.js +665 -0
  67. package/dist/assets/HoverCardDoc-CdTU2QkI.js +31 -0
  68. package/dist/assets/I18nDoc-CMEvFqsz.js +232 -0
  69. package/dist/assets/IconPickerDoc-DF9hEwnJ.js +10 -0
  70. package/dist/assets/IconsFoundationDoc-D4Y0wKbm.js +33 -0
  71. package/dist/assets/InputDoc-d_IL4dsq.js +211 -0
  72. package/dist/assets/LabelDoc-Dr64ISiJ.js +42 -0
  73. package/dist/assets/LeadershipDoc-BnrTuaeV.js +416 -0
  74. package/dist/assets/MediaDoc-CLuVprAr.js +459 -0
  75. package/dist/assets/MenubarDoc-CW7L4QJ4.js +165 -0
  76. package/dist/assets/ModulesDialogDoc-CUb_g4X-.js +71 -0
  77. package/dist/assets/NavigationMenuDoc-Csc0U6bV.js +116 -0
  78. package/dist/assets/OnboardingDialogDoc-3RtjNH1O.js +55 -0
  79. package/dist/assets/PaginationDoc-BGurD4xQ.js +27 -0
  80. package/dist/assets/PaginationDoc-DqFyou6O.js +98 -0
  81. package/dist/assets/PlacesDoc-Dyx8gsqb.js +226 -0
  82. package/dist/assets/PopoverDoc-DHF-ItUX.js +64 -0
  83. package/dist/assets/ProgressDoc-DXKV-fkI.js +29 -0
  84. package/dist/assets/QualiexUserFieldDoc-BbP7w-Pu.js +149 -0
  85. package/dist/assets/RadioGroupDoc-D845uweM.js +57 -0
  86. package/dist/assets/RadiusDoc-vN4tTsay.js +7 -0
  87. package/dist/assets/RequiredFieldsCounterDoc-TzR9r-U9.js +58 -0
  88. package/dist/assets/ResizableDoc-Bkfz_25O.js +104 -0
  89. package/dist/assets/RichTextEditorDoc-BUQrg7M8.js +24 -0
  90. package/dist/assets/ScrollAreaDoc-B6ODYHMX.js +28 -0
  91. package/dist/assets/SecurityDoc-Chbt6w1s.js +204 -0
  92. package/dist/assets/SelectDoc-BhcpBIAO.js +80 -0
  93. package/dist/assets/SeparatorDoc-C3fhatb0.js +4 -0
  94. package/dist/assets/ServicesDoc-_uao-HA_.js +308 -0
  95. package/dist/assets/ShadowsDoc-DpkO_TZQ.js +9 -0
  96. package/dist/assets/SignDoc-BJtnoT6I.js +66 -0
  97. package/dist/assets/SkeletonDoc-BZS07PJh.js +54 -0
  98. package/dist/assets/SliderDoc-D2ApV3XT.js +41 -0
  99. package/dist/assets/SpacingDoc-PNrU24B2.js +12 -0
  100. package/dist/assets/SplitButtonDoc-D5tUF2Ja.js +53 -0
  101. package/dist/assets/StepSelectorDoc-Cj0ALYar.js +41 -0
  102. package/dist/assets/SwitchDoc-DtsT8oh_.js +56 -0
  103. package/dist/assets/TableDoc-BC-jQnXu.js +128 -0
  104. package/dist/assets/TableOfContents-DBMJMbI4.js +1 -0
  105. package/dist/assets/TabsDoc-DtXJ0xY5.js +42 -0
  106. package/dist/assets/TextareaDoc-nuW5tqBQ.js +46 -0
  107. package/dist/assets/ToastDoc-D1aX5zda.js +157 -0
  108. package/dist/assets/ToggleDoc-ILass4CS.js +51 -0
  109. package/dist/assets/TooltipDoc-lPbdWe_9.js +58 -0
  110. package/dist/assets/TruncatedCellDoc-DOAzbF2F.js +12 -0
  111. package/dist/assets/TypographyFoundationDoc-3ZD-rQZw.js +7 -0
  112. package/dist/assets/UtilitiesDoc-D7lkYhuz.js +145 -0
  113. package/dist/assets/blocks-Jy49RoqJ.js +1 -0
  114. package/dist/assets/calendar-days-Cvf2zLJl.js +1 -0
  115. package/dist/assets/circle-plus-MnG9kjyq.js +1 -0
  116. package/dist/assets/circle-x-B9ouupla.js +1 -0
  117. package/dist/assets/crown-BweN5jpI.js +1 -0
  118. package/dist/assets/date-picker-ttyYeYvC.js +1 -0
  119. package/dist/assets/disabled-menu-item-WlpPOqxg.js +1 -0
  120. package/dist/assets/drawer-DvU6_eK5.js +3 -0
  121. package/dist/assets/file-pen-line-C0VV-QjF.js +1 -0
  122. package/dist/assets/git-branch-DCjGGwvF.js +1 -0
  123. package/dist/assets/globe-BdFDFP_k.js +1 -0
  124. package/dist/assets/grip-vertical-CgXp0oI-.js +1 -0
  125. package/dist/assets/hash-BAYi_wfk.js +1 -0
  126. package/dist/assets/index-BtX5DZqb.js +310 -0
  127. package/dist/assets/index-C1So5Sai.css +1 -0
  128. package/dist/assets/life-buoy-BydIgTyJ.js +1 -0
  129. package/dist/assets/lucide-react-ZIMhRYmb.js +1 -0
  130. package/dist/assets/monitor-B6txWJPg.js +1 -0
  131. package/dist/assets/package-DNe3FsCh.js +1 -0
  132. package/dist/assets/pen-CzTmQ16z.js +1 -0
  133. package/dist/assets/pin-CJJgLEBz.js +1 -0
  134. package/dist/assets/radio-group-Btv_BY60.js +1 -0
  135. package/dist/assets/server-XQDXtrjm.js +1 -0
  136. package/dist/assets/share-2-Dz_89MJb.js +1 -0
  137. package/dist/assets/step-selector-D0_Y1dow.js +1 -0
  138. package/dist/assets/text-align-start-WsHo7CNJ.js +1 -0
  139. package/dist/assets/trash-CeK-mWnM.js +1 -0
  140. package/dist/assets/useMockCrud-RV9z9n5x.js +1 -0
  141. package/dist/assets/user-check-CrbWcnPN.js +1 -0
  142. package/dist/assets/user-plus-Dce9DbqQ.js +1 -0
  143. package/dist/auth/services/TokenManager.d.ts +5 -0
  144. package/dist/auth/services/TokenRegenerationService.d.ts +5 -3
  145. package/dist/auth/services/TokenService.d.ts +0 -4
  146. package/dist/bin/pull-docs.js +87 -64
  147. package/dist/components/modules/ModuleAccessGuard.d.ts +16 -0
  148. package/dist/components/modules/index.d.ts +2 -0
  149. package/dist/components/ui/chart.d.ts +1 -1
  150. package/dist/components/ui/color-picker.d.ts +4 -0
  151. package/dist/components/ui/combo-tree.d.ts +70 -0
  152. package/dist/components/ui/combobox.d.ts +1 -0
  153. package/dist/components/ui/dialog.d.ts +8 -0
  154. package/dist/components/ui/icon-picker.d.ts +2 -0
  155. package/dist/components/ui/input-group.d.ts +1 -1
  156. package/dist/components/ui/resizable.d.ts +1 -1
  157. package/dist/config/environments.d.ts +12 -0
  158. package/dist/config/index.d.ts +23 -9
  159. package/dist/contexts/ModuleContext.d.ts +34 -0
  160. package/dist/crud/components/SelectionCheckbox.d.ts +9 -0
  161. package/dist/crud/generateCrudConfig.d.ts +2 -2
  162. package/dist/docs/KNOWLEDGE.md +206 -0
  163. package/dist/exports/ui.d.ts +1 -0
  164. package/dist/hooks/useMediaQuery.d.ts +14 -0
  165. package/dist/hooks/useModuleAccess.d.ts +60 -0
  166. package/dist/hooks/usePageTitle.d.ts +7 -1
  167. package/dist/index.css +2 -2
  168. package/dist/index.css.map +1 -1
  169. package/dist/index.d.ts +9 -1
  170. package/dist/index.esm.js +1 -1
  171. package/dist/index.html +16 -11
  172. package/dist/index.js +1 -1
  173. package/dist/leadership/hooks/useLeadershipMutations.d.ts +0 -1
  174. package/dist/media/hooks/useMediaUpload.d.ts +0 -1
  175. package/dist/media/utils/imageHelpers.d.ts +1 -1
  176. package/dist/places/services/PlaceService.d.ts +1 -1
  177. package/dist/providers/CoreProviders.d.ts +20 -4
  178. package/dist/qualiex/services/qualiexApi.d.ts +22 -4
  179. package/dist/services/QualiexEnrichmentService.d.ts +0 -12
  180. package/dist/setup.d.ts +2 -0
  181. package/dist/sign/services/signService.d.ts +0 -6
  182. package/dist/types.d.ts +59 -10
  183. package/dist/utils/index.d.ts +2 -2
  184. package/docs/DESIGN_SYSTEM.md +12181 -0
  185. package/docs/KNOWLEDGE.md +206 -0
  186. package/docs/PUBLISH.md +168 -0
  187. package/package.json +16 -18
  188. package/dist/assets/index-D0RTIFH3.css +0 -1
  189. package/dist/assets/index-YMQXWoDk.js +0 -9868
  190. package/dist/auth/utils/AuthUtils.d.ts +0 -4
  191. package/dist/i18n/DatabaseBackend.d.ts +0 -9
  192. package/dist/i18n/components/TranslationLoader.d.ts +0 -10
  193. package/dist/services/TranslationService.d.ts +0 -20
@@ -0,0 +1,206 @@
1
+ # KNOWLEDGE — Regras Críticas do Projeto
2
+
3
+ > 📖 **Fonte oficial completa**: `README.md` | 🎨 **Design System**: `docs/DESIGN_SYSTEM.md`
4
+ > 🤖 **Para IA**: Consulte `.note/memory/` para padrões de componentes e layout
5
+
6
+ ---
7
+
8
+ ## 0. Variável de Schema
9
+
10
+ > ⚠️ **SCHEMA_PADRAO = `common`**
11
+ >
12
+ > Todos os exemplos abaixo usam `SCHEMA_PADRAO`. Em cada projeto, substitua pelo schema correto.
13
+ > **Neste projeto o schema é `common`.**
14
+
15
+ ---
16
+
17
+ ## 1. Schema Padrão
18
+
19
+ Toda query Supabase **DEVE** usar `.schema('SCHEMA_PADRAO')`. O projeto **NÃO** usa o schema `public`.
20
+
21
+ ```ts
22
+ // ✅ CORRETO
23
+ const { data } = await supabase.schema('SCHEMA_PADRAO').from('tabela').select('*');
24
+
25
+ // ❌ ERRADO (vai falhar em produção)
26
+ const { data } = await supabase.from('tabela').select('*');
27
+ ```
28
+
29
+ ---
30
+
31
+ ## 2. RLS Policies
32
+
33
+ ### Regras obrigatórias
34
+ - **NUNCA** criar policy `FOR DELETE` — usar soft delete (`deleted_at` + policy `FOR UPDATE`)
35
+ - **SEMPRE** usar `(SELECT auth.uid())` ou `(SELECT auth.jwt())` com parênteses — evita re-execução por linha
36
+ - Sintaxe: `SELECT` → `USING` | `INSERT` → `WITH CHECK` | `UPDATE` → `USING` + `WITH CHECK`
37
+
38
+ ### Padrão JWT alias (multi-tenancy por alias)
39
+
40
+ ```sql
41
+ -- SELECT
42
+ CREATE POLICY "table_select" ON SCHEMA_PADRAO.tabela
43
+ FOR SELECT USING (
44
+ ((SELECT auth.jwt()) ->> 'alias'::text) = alias
45
+ );
46
+
47
+ -- INSERT
48
+ CREATE POLICY "table_insert" ON SCHEMA_PADRAO.tabela
49
+ FOR INSERT WITH CHECK (
50
+ ((SELECT auth.jwt()) ->> 'alias'::text) = alias
51
+ );
52
+
53
+ -- UPDATE
54
+ CREATE POLICY "table_update" ON SCHEMA_PADRAO.tabela
55
+ FOR UPDATE
56
+ USING (((SELECT auth.jwt()) ->> 'alias'::text) = alias)
57
+ WITH CHECK (((SELECT auth.jwt()) ->> 'alias'::text) = alias);
58
+ ```
59
+
60
+ ### Alternativa: auth.uid() (quando tabela tem `id_user`)
61
+
62
+ ```sql
63
+ CREATE POLICY "table_select" ON SCHEMA_PADRAO.tabela
64
+ FOR SELECT USING (auth.uid() = id_user);
65
+
66
+ CREATE POLICY "table_insert" ON SCHEMA_PADRAO.tabela
67
+ FOR INSERT WITH CHECK (auth.uid() = id_user);
68
+
69
+ CREATE POLICY "table_update" ON SCHEMA_PADRAO.tabela
70
+ FOR UPDATE
71
+ USING (auth.uid() = id_user)
72
+ WITH CHECK (auth.uid() = id_user);
73
+ ```
74
+
75
+ ### Padrão company_id (multi-tenancy por empresa)
76
+
77
+ ```sql
78
+ CREATE POLICY "table_select" ON SCHEMA_PADRAO.tabela
79
+ FOR SELECT TO authenticated
80
+ USING (
81
+ company_id = (
82
+ SELECT (auth.jwt() -> 'user_metadata' ->> 'company_id')::uuid
83
+ )
84
+ );
85
+ ```
86
+
87
+ ### ❌ Erros comuns de RLS
88
+
89
+ ```sql
90
+ -- ❌ WITH CHECK em SELECT (deve ser USING)
91
+ CREATE POLICY "x" ON SCHEMA_PADRAO.t FOR SELECT WITH CHECK (...);
92
+
93
+ -- ❌ USING em INSERT (deve ser WITH CHECK)
94
+ CREATE POLICY "x" ON SCHEMA_PADRAO.t FOR INSERT USING (...);
95
+
96
+ -- ❌ Parênteses extra no JWT
97
+ CREATE POLICY "x" ON SCHEMA_PADRAO.t FOR SELECT USING (
98
+ ((SELECT (auth.jwt()) ->> 'alias'::text)) = alias
99
+ );
100
+
101
+ -- ❌ Política DELETE (usar soft delete)
102
+ CREATE POLICY "x" ON SCHEMA_PADRAO.t FOR DELETE USING (...);
103
+ ```
104
+
105
+ ### Soft delete (padrão obrigatório)
106
+
107
+ ```sql
108
+ ALTER TABLE SCHEMA_PADRAO.tabela ADD COLUMN deleted_at TIMESTAMP WITH TIME ZONE;
109
+
110
+ -- Filtrar registros ativos
111
+ CREATE POLICY "table_select" ON SCHEMA_PADRAO.tabela
112
+ FOR SELECT USING (
113
+ deleted_at IS NULL
114
+ AND ((SELECT auth.jwt()) ->> 'alias'::text) = alias
115
+ );
116
+ ```
117
+
118
+ ### Tabela de roles (quando necessário)
119
+
120
+ Usar função `SECURITY DEFINER` para checar roles e evitar recursão RLS:
121
+
122
+ ```sql
123
+ CREATE FUNCTION public.has_role(_user_id uuid, _role app_role)
124
+ RETURNS boolean LANGUAGE sql STABLE SECURITY DEFINER
125
+ SET search_path = public AS $$
126
+ SELECT EXISTS (SELECT 1 FROM public.user_roles WHERE user_id = _user_id AND role = _role)
127
+ $$;
128
+ ```
129
+
130
+ ---
131
+
132
+ ## 3. Convenções de Nomenclatura (SQL)
133
+
134
+ | Tipo | Padrão | Exemplo |
135
+ |------|--------|---------|
136
+ | FK | `id_<tabela_singular>` | `id_process`, `id_user` |
137
+ | Boolean | `is_` ou `has_` | `is_active`, `has_access` |
138
+ | Timestamps | `created_at`, `updated_at`, `deleted_at` | — |
139
+ | Tabelas | plural, snake_case | `processes`, `user_roles` |
140
+
141
+ ---
142
+
143
+ ## 4. Proibições
144
+
145
+ | Regra | Detalhe |
146
+ |-------|---------|
147
+ | ❌ Índices automáticos | Nunca criar índices em migrations sem aprovação explícita |
148
+ | ❌ Modificar `.env` | Nunca sem autorização explícita do usuário |
149
+ | ❌ Policy DELETE | Usar soft delete com `deleted_at` |
150
+ | ❌ Duplicar componentes da lib | Sempre usar `forlogic-core` primeiro |
151
+ | ❌ Hardcoded admin checks | Nunca usar localStorage/sessionStorage para verificar roles |
152
+ | ❌ Import direto do client auto-gerado | Nunca importar de `@/integrations/supabase/client`. Usar `getSupabaseClient()` de `forlogic-core`. ESLint `no-restricted-imports` bloqueia automaticamente. O arquivo existe apenas como fonte de dados para o `vite.config.ts`. |
153
+
154
+ ---
155
+
156
+ ## 5. Lib-First (forlogic-core)
157
+
158
+ Antes de criar qualquer componente, verificar se já existe em `forlogic-core`:
159
+
160
+ - **UI**: Button, Dialog, Input, Select, Combobox, SplitButton, RichTextEditor, ColorPicker, IconPicker, etc.
161
+ - **Layout**: AppLayout, AppHeader, AppSidebar, BodyContent
162
+ - **CRUD**: createCrudPage, CrudTable, CrudGrid, CrudActionBar, BaseForm
163
+ - **Utilitários**: ActionButton, Pagination, FilterBar, EmptyState, LoadingState, StepSelector
164
+ - **Módulos**: Sign, Places, Leadership, Media, ModulesDialog
165
+
166
+ ```ts
167
+ import { Button, Dialog, createCrudPage, cn, formatDatetime } from 'forlogic-core';
168
+ ```
169
+
170
+ ---
171
+
172
+ ## 6. Padrões CRUD
173
+
174
+ - **Toolbar**: Layout 3 zonas — Esquerda (Botão Novo + Ações em lote), Centro (Busca), Direita (Filtros + Toggle view)
175
+ - **Paginação**: Sempre usar `CrudPrimitivePagination` com `variant="full"`
176
+ - **Ações em lote**: Dropdown "Ações em lote" no CrudActionBar (não criar BulkActionBar separado)
177
+ - **Ações de linha**: Sempre usar `ActionButton` da lib (nunca botão genérico com ícone MoreHorizontal)
178
+
179
+ ---
180
+
181
+ ## 7. Componentes/Padrões Deprecated
182
+
183
+ | Não usar | Usar em vez disso |
184
+ |----------|-------------------|
185
+ | `BulkActionBar` separado | Dropdown integrado no `CrudActionBar` |
186
+ | Botão genérico `<MoreHorizontal>` | `ActionButton` da lib |
187
+ | Paginação manual | `CrudPrimitivePagination` |
188
+ | `public` schema | `.schema('SCHEMA_PADRAO')` |
189
+ | `StatusSelect` | `Combobox` |
190
+ | `DeleteConfirmationDialog` | `Dialog` |
191
+ | `Searchbar` | `Input` com ícone |
192
+
193
+ ---
194
+
195
+ ## 8. Fontes Complementares
196
+
197
+ | Fonte | Caminho | Conteúdo |
198
+ |-------|---------|----------|
199
+ | **Memory rules** | `.note/memory/rules/` | Regras de schema, RLS, índices, .env |
200
+ | **Memory patterns** | `.note/memory/patterns/` | Layouts CRUD, toolbar, scroll, navegação SPA |
201
+ | **Memory components** | `.note/memory/components/` | ActionButton, BaseForm, Dialog, Pagination |
202
+ | **README.md** | `README.md` | Documentação completa e genérica da lib |
203
+ | **Design System** | Rota `/ds` no app | Documentação visual de todos os componentes |
204
+ | **DESIGN_SYSTEM.md** | `docs/DESIGN_SYSTEM.md` | Documentação técnica do Design System |
205
+
206
+ > 📌 Ao implementar qualquer funcionalidade, consulte as fontes acima antes de criar código novo.
@@ -71,3 +71,4 @@ export * from '../components/ui/rich-text-editor';
71
71
  export * from '../components/ui/onboarding-dialog';
72
72
  export * from '../components/ui/split-button';
73
73
  export * from '../components/ui/step-selector';
74
+ export { ComboTree, type ComboTreeProps, type ComboTreeOption } from '../components/ui/combo-tree';
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Hook reativo para media queries CSS via `matchMedia`.
3
+ *
4
+ * @example
5
+ * ```ts
6
+ * const isMobile = useMediaQuery('(max-width: 767px)');
7
+ * const prefersDark = useMediaQuery('(prefers-color-scheme: dark)');
8
+ * ```
9
+ */
10
+ export declare function useMediaQuery(query: string): boolean;
11
+ /**
12
+ * Atalho para detectar telas mobile (< 768px por padrão).
13
+ */
14
+ export declare function useIsMobile(breakpoint?: number): boolean;
@@ -0,0 +1,60 @@
1
+ import type { ModuleAccessResult } from '../types';
2
+ /**
3
+ * Hook para verificar se o usuário logado tem acesso a um módulo específico.
4
+ *
5
+ * Busca a lista de softwares e as associações do usuário via API Qualiex,
6
+ * cruza os dados e retorna se o usuário tem acesso ao módulo configurado.
7
+ *
8
+ * **Pré-requisitos:**
9
+ * - O projeto deve configurar `moduleAlias` no `CoreProviders`
10
+ * - O usuário deve estar autenticado (via `useAuth`)
11
+ *
12
+ * **Cache:**
13
+ * - Softwares: cache de 30 minutos (raramente muda)
14
+ * - Associações: cache de 10 minutos (pode mudar com permissões)
15
+ * - Ambos são limpos automaticamente no `switchUnit`
16
+ *
17
+ * @param moduleAliasOverride - Alias opcional para verificar acesso a outro módulo
18
+ * (ignora o alias configurado no CoreProviders)
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * // Uso básico — verifica o módulo configurado no CoreProviders
23
+ * function Dashboard() {
24
+ * const { hasAccess, isLoading, role } = useModuleAccess();
25
+ *
26
+ * if (isLoading) return <LoadingState />;
27
+ * if (!hasAccess) return <AccessDenied />;
28
+ *
29
+ * return <DashboardContent />;
30
+ * }
31
+ * ```
32
+ *
33
+ * @example
34
+ * ```tsx
35
+ * // Verificar acesso a outro módulo
36
+ * function SupplierLink() {
37
+ * const { hasAccessTo } = useModuleAccess();
38
+ *
39
+ * if (!hasAccessTo('suppliers')) return null;
40
+ * return <Link to="/suppliers">Fornecedores</Link>;
41
+ * }
42
+ * ```
43
+ *
44
+ * @example
45
+ * ```tsx
46
+ * // Verificar acesso a múltiplos módulos
47
+ * function Navigation() {
48
+ * const { hasAccessTo } = useModuleAccess();
49
+ *
50
+ * return (
51
+ * <nav>
52
+ * {hasAccessTo('occurrences') && <Link to="/occurrences">Ocorrências</Link>}
53
+ * {hasAccessTo('audit') && <Link to="/audit">Auditorias</Link>}
54
+ * {hasAccessTo(['suppliers', 'suppliers-portal']) && <Link to="/suppliers">Fornecedores</Link>}
55
+ * </nav>
56
+ * );
57
+ * }
58
+ * ```
59
+ */
60
+ export declare function useModuleAccess(moduleAliasOverride?: string): ModuleAccessResult;
@@ -1,4 +1,10 @@
1
1
  /**
2
- * Hook para obter o título da página atual baseado na rota
2
+ * @deprecated Use a lógica de route matching diretamente no AppHeader.
3
+ * Mantido apenas para compatibilidade — não adicionar novos consumidores.
3
4
  */
4
5
  export declare function usePageTitle(): string;
6
+ /** Função pura para resolver título — usada internamente pelo AppHeader */
7
+ export declare function resolvePageTitle(navigation: Array<{
8
+ path: string;
9
+ label: string;
10
+ }> | undefined, pathname: string): string;