semmet-angular 0.42.0 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/README.en.md +2 -315
  2. package/README.md +169 -264
  3. package/package.json +2 -2
  4. package/src/accordion/files/__name@dasherize__/__name@dasherize__.css.template +4 -41
  5. package/src/accordion/schema.json +19 -4
  6. package/src/alert/files/__name@dasherize__/__name@dasherize__.css.template +1 -25
  7. package/src/alert/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
  8. package/src/alert/files/__name@dasherize__/__name@dasherize__.ts.template +4 -1
  9. package/src/alert/schema.json +19 -4
  10. package/src/alert-dialog/files/__name@dasherize__/__name@dasherize__.css.template +3 -56
  11. package/src/alert-dialog/files/__name@dasherize__/__name@dasherize__.html.template +6 -6
  12. package/src/alert-dialog/files/__name@dasherize__/__name@dasherize__.ts.template +7 -1
  13. package/src/alert-dialog/schema.json +19 -4
  14. package/src/avatar/files/__name@dasherize__/__name@dasherize__.css.template +17 -0
  15. package/src/avatar/files/__name@dasherize__/__name@dasherize__.html.template +28 -0
  16. package/src/avatar/files/__name@dasherize__/__name@dasherize__.spec.ts.template +27 -0
  17. package/src/avatar/files/__name@dasherize__/__name@dasherize__.ts.template +35 -0
  18. package/src/avatar/index.d.ts +1 -0
  19. package/src/avatar/index.js +6 -0
  20. package/src/avatar/index.js.map +1 -0
  21. package/src/avatar/index.ts +3 -0
  22. package/src/avatar/schema.d.ts +1 -0
  23. package/src/avatar/schema.js +3 -0
  24. package/src/avatar/schema.js.map +1 -0
  25. package/src/avatar/schema.json +44 -0
  26. package/src/avatar/schema.ts +1 -0
  27. package/src/badge/files/__name@dasherize__/__name@dasherize__.css.template +0 -77
  28. package/src/badge/files/__name@dasherize__/__name@dasherize__.ts.template +2 -5
  29. package/src/badge/schema.json +19 -4
  30. package/src/block/files/__name@dasherize__/__name@dasherize__.css.template +10 -81
  31. package/src/block/files/__name@dasherize__/__name@dasherize__.html.template +33 -25
  32. package/src/block/files/__name@dasherize__/__name@dasherize__.ts.template +41 -10
  33. package/src/block/schema.json +19 -4
  34. package/src/breadcrumb/files/__name@dasherize__/__name@dasherize__.css.template +2 -23
  35. package/src/breadcrumb/files/__name@dasherize__/__name@dasherize__.html.template +4 -4
  36. package/src/breadcrumb/files/__name@dasherize__/__name@dasherize__.ts.template +9 -5
  37. package/src/breadcrumb/schema.json +19 -4
  38. package/src/button/files/__name@dasherize__/__name@dasherize__.css.template +2 -79
  39. package/src/button/files/__name@dasherize__/__name@dasherize__.ts.template +2 -5
  40. package/src/button/schema.json +19 -4
  41. package/src/button-group/files/__name@dasherize__/__name@dasherize__.css.template +2 -70
  42. package/src/button-group/files/__name@dasherize__/__name@dasherize__.ts.template +1 -2
  43. package/src/button-group/schema.json +19 -4
  44. package/src/card/files/__name@dasherize__/__name@dasherize__.css.template +0 -67
  45. package/src/card/files/__name@dasherize__/__name@dasherize__.html.template +10 -55
  46. package/src/card/files/__name@dasherize__/__name@dasherize__.ts.template +2 -45
  47. package/src/card/schema.json +19 -4
  48. package/src/carousel/files/__name@dasherize__/__name@dasherize__.css.template +2 -32
  49. package/src/carousel/files/__name@dasherize__/__name@dasherize__.html.template +4 -4
  50. package/src/carousel/files/__name@dasherize__/__name@dasherize__.ts.template +4 -0
  51. package/src/carousel/schema.json +19 -4
  52. package/src/checkbox/files/__name@dasherize__/__name@dasherize__.css.template +5 -21
  53. package/src/checkbox/schema.json +19 -4
  54. package/src/close-button/files/__name@dasherize__/__name@dasherize__.css.template +9 -47
  55. package/src/close-button/files/__name@dasherize__/__name@dasherize__.ts.template +2 -5
  56. package/src/close-button/schema.json +19 -4
  57. package/src/collection.json +15 -0
  58. package/src/combobox/files/__name@dasherize__/__name@dasherize__.css.template +4 -49
  59. package/src/combobox/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  60. package/src/combobox/files/__name@dasherize__/__name@dasherize__.ts.template +11 -8
  61. package/src/combobox/schema.json +19 -4
  62. package/src/dialog/files/__name@dasherize__/__name@dasherize__.css.template +3 -45
  63. package/src/dialog/files/__name@dasherize__/__name@dasherize__.html.template +5 -5
  64. package/src/dialog/files/__name@dasherize__/__name@dasherize__.ts.template +6 -1
  65. package/src/dialog/schema.json +19 -4
  66. package/src/disclosure/files/__name@dasherize__/__name@dasherize__.css.template +4 -36
  67. package/src/disclosure/schema.json +19 -4
  68. package/src/form/files/__name@dasherize__/__name@dasherize__.css.template +1 -77
  69. package/src/form/files/__name@dasherize__/__name@dasherize__.html.template +7 -7
  70. package/src/form/files/__name@dasherize__/__name@dasherize__.ts.template +20 -7
  71. package/src/form/schema.json +19 -4
  72. package/src/input/files/__name@dasherize__/__name@dasherize__.css.template +2 -58
  73. package/src/input/schema.json +19 -4
  74. package/src/input-group/files/__name@dasherize__/__name@dasherize__.css.template +2 -68
  75. package/src/input-group/files/__name@dasherize__/__name@dasherize__.html.template +13 -5
  76. package/src/input-group/files/__name@dasherize__/__name@dasherize__.ts.template +21 -6
  77. package/src/input-group/schema.json +19 -4
  78. package/src/landmarks/files/__name@dasherize__/__name@dasherize__.css.template +0 -24
  79. package/src/landmarks/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  80. package/src/landmarks/files/__name@dasherize__/__name@dasherize__.ts.template +5 -2
  81. package/src/landmarks/schema.json +19 -4
  82. package/src/list-group/files/__name@dasherize__/__name@dasherize__.css.template +0 -123
  83. package/src/list-group/files/__name@dasherize__/__name@dasherize__.e2e-spec.ts.template +8 -9
  84. package/src/list-group/files/__name@dasherize__/__name@dasherize__.html.template +13 -47
  85. package/src/list-group/files/__name@dasherize__/__name@dasherize__.spec.ts.template +46 -24
  86. package/src/list-group/files/__name@dasherize__/__name@dasherize__.ts.template +97 -39
  87. package/src/list-group/schema.json +19 -4
  88. package/src/listbox/files/__name@dasherize__/__name@dasherize__.css.template +3 -37
  89. package/src/listbox/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  90. package/src/listbox/files/__name@dasherize__/__name@dasherize__.ts.template +3 -1
  91. package/src/listbox/schema.json +19 -4
  92. package/src/menu-button/files/__name@dasherize__/__name@dasherize__.css.template +7 -47
  93. package/src/menu-button/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
  94. package/src/menu-button/files/__name@dasherize__/__name@dasherize__.ts.template +10 -7
  95. package/src/menu-button/schema.json +19 -4
  96. package/src/meter/files/__name@dasherize__/__name@dasherize__.css.template +0 -12
  97. package/src/meter/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  98. package/src/meter/files/__name@dasherize__/__name@dasherize__.ts.template +3 -1
  99. package/src/meter/schema.json +19 -4
  100. package/src/navbar/files/__name@dasherize__/__name@dasherize__.css.template +6 -62
  101. package/src/navbar/schema.json +19 -4
  102. package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.css.template +6 -37
  103. package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.html.template +7 -6
  104. package/src/navigation-menu/files/__name@dasherize__/__name@dasherize__.ts.template +15 -1
  105. package/src/navigation-menu/schema.json +19 -4
  106. package/src/offcanvas/files/__name@dasherize__/__name@dasherize__.css.template +3 -70
  107. package/src/offcanvas/schema.json +19 -4
  108. package/src/pagination/files/__name@dasherize__/__name@dasherize__.css.template +2 -33
  109. package/src/pagination/files/__name@dasherize__/__name@dasherize__.html.template +6 -6
  110. package/src/pagination/files/__name@dasherize__/__name@dasherize__.ts.template +7 -1
  111. package/src/pagination/schema.json +19 -4
  112. package/src/popover/files/__name@dasherize__/__name@dasherize__.css.template +8 -69
  113. package/src/popover/schema.json +19 -4
  114. package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.css.template +1 -31
  115. package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
  116. package/src/progress-bar/files/__name@dasherize__/__name@dasherize__.ts.template +5 -1
  117. package/src/progress-bar/schema.json +19 -4
  118. package/src/radio-group/files/__name@dasherize__/__name@dasherize__.css.template +4 -31
  119. package/src/radio-group/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  120. package/src/radio-group/files/__name@dasherize__/__name@dasherize__.ts.template +2 -1
  121. package/src/radio-group/schema.json +19 -4
  122. package/src/rating/files/__name@dasherize__/__name@dasherize__.css.template +17 -0
  123. package/src/rating/files/__name@dasherize__/__name@dasherize__.html.template +34 -0
  124. package/src/rating/files/__name@dasherize__/__name@dasherize__.spec.ts.template +38 -0
  125. package/src/rating/files/__name@dasherize__/__name@dasherize__.ts.template +75 -0
  126. package/src/rating/index.d.ts +1 -0
  127. package/src/rating/index.js +6 -0
  128. package/src/rating/index.js.map +1 -0
  129. package/src/rating/index.ts +3 -0
  130. package/src/rating/schema.d.ts +1 -0
  131. package/src/rating/schema.js +3 -0
  132. package/src/rating/schema.js.map +1 -0
  133. package/src/rating/schema.json +44 -0
  134. package/src/rating/schema.ts +1 -0
  135. package/src/select/files/__name@dasherize__/__name@dasherize__.css.template +4 -55
  136. package/src/select/schema.json +19 -4
  137. package/src/skeleton/files/__name@dasherize__/__name@dasherize__.css.template +2 -29
  138. package/src/skeleton/files/__name@dasherize__/__name@dasherize__.ts.template +1 -3
  139. package/src/skeleton/schema.json +19 -4
  140. package/src/skip-link/files/__name@dasherize__/__name@dasherize__.css.template +2 -14
  141. package/src/skip-link/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  142. package/src/skip-link/files/__name@dasherize__/__name@dasherize__.ts.template +5 -2
  143. package/src/skip-link/schema.json +19 -4
  144. package/src/slider/files/__name@dasherize__/__name@dasherize__.css.template +6 -20
  145. package/src/slider/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  146. package/src/slider/files/__name@dasherize__/__name@dasherize__.ts.template +3 -1
  147. package/src/slider/schema.json +19 -4
  148. package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.css.template +6 -35
  149. package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.html.template +4 -4
  150. package/src/spinbutton/files/__name@dasherize__/__name@dasherize__.ts.template +5 -1
  151. package/src/spinbutton/schema.json +19 -4
  152. package/src/spinner/files/__name@dasherize__/__name@dasherize__.css.template +0 -43
  153. package/src/spinner/files/__name@dasherize__/__name@dasherize__.ts.template +2 -5
  154. package/src/spinner/schema.json +19 -4
  155. package/src/steps/files/__name@dasherize__/__name@dasherize__.css.template +36 -0
  156. package/src/steps/files/__name@dasherize__/__name@dasherize__.html.template +44 -0
  157. package/src/steps/files/__name@dasherize__/__name@dasherize__.spec.ts.template +35 -0
  158. package/src/steps/files/__name@dasherize__/__name@dasherize__.ts.template +107 -0
  159. package/src/steps/index.d.ts +1 -0
  160. package/src/steps/index.js +6 -0
  161. package/src/steps/index.js.map +1 -0
  162. package/src/steps/index.ts +3 -0
  163. package/src/steps/schema.d.ts +1 -0
  164. package/src/steps/schema.js +3 -0
  165. package/src/steps/schema.js.map +1 -0
  166. package/src/steps/schema.json +44 -0
  167. package/src/steps/schema.ts +1 -0
  168. package/src/switch/files/__name@dasherize__/__name@dasherize__.css.template +7 -22
  169. package/src/switch/schema.json +19 -4
  170. package/src/table/files/__name@dasherize__/__name@dasherize__.css.template +0 -25
  171. package/src/table/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
  172. package/src/table/files/__name@dasherize__/__name@dasherize__.ts.template +3 -0
  173. package/src/table/schema.json +19 -4
  174. package/src/tabs/files/__name@dasherize__/__name@dasherize__.css.template +5 -44
  175. package/src/tabs/files/__name@dasherize__/__name@dasherize__.html.template +2 -2
  176. package/src/tabs/files/__name@dasherize__/__name@dasherize__.ts.template +2 -0
  177. package/src/tabs/schema.json +19 -4
  178. package/src/textarea/files/__name@dasherize__/__name@dasherize__.css.template +2 -59
  179. package/src/textarea/schema.json +19 -4
  180. package/src/toast/files/__name@dasherize__/__name@dasherize__.css.template +1 -35
  181. package/src/toast/files/__name@dasherize__/__name@dasherize__.html.template +4 -4
  182. package/src/toast/files/__name@dasherize__/__name@dasherize__.ts.template +5 -1
  183. package/src/toast/schema.json +19 -4
  184. package/src/toolbar/files/__name@dasherize__/__name@dasherize__.css.template +2 -36
  185. package/src/toolbar/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
  186. package/src/toolbar/files/__name@dasherize__/__name@dasherize__.ts.template +11 -8
  187. package/src/toolbar/schema.json +19 -4
  188. package/src/tooltip/files/__name@dasherize__/__name@dasherize__.css.template +1 -32
  189. package/src/tooltip/schema.json +19 -4
  190. package/src/tree-view/files/__name@dasherize__/__name@dasherize__.css.template +5 -27
  191. package/src/tree-view/files/__name@dasherize__/__name@dasherize__.html.template +3 -3
  192. package/src/tree-view/files/__name@dasherize__/__name@dasherize__.ts.template +16 -13
  193. package/src/tree-view/schema.json +19 -4
  194. package/src/utils/generate-component.js +3 -1
  195. package/src/utils/generate-component.js.map +1 -1
  196. package/src/utils/generate-component.ts +3 -1
  197. package/src/utils/generate-composition.js +0 -1
  198. package/src/utils/generate-composition.js.map +1 -1
  199. package/src/utils/generate-composition.ts +0 -1
  200. package/src/utils/schema-types.d.ts +1 -0
  201. package/src/utils/schema-types.ts +1 -0
  202. package/README.pt-BR.md +0 -330
package/README.md CHANGED
@@ -1,332 +1,237 @@
1
1
  # semmet-angular
2
2
 
3
- **Dev kit de entrega de UI acessível em Angular.**
3
+ **Accessible Angular UI generation for Angular applications.**
4
4
 
5
- Gere componentes Angular acessíveis, blocos de interface e scaffolds de entrega pelo CLI.
5
+ Semmet Angular is a collection of Angular CLI schematics that generate accessible, editable application code: components, starter blocks, tests, and delivery scaffolds.
6
6
 
7
- Semmet Angular ajuda times a gerar, compor, testar, verificar e empacotar UI acessível usando o ecossistema do Angular CLI.
7
+ The generated code belongs to the consuming project. There is no Semmet runtime UI package to import at runtime; `semmet-angular` is only needed when generating files.
8
8
 
9
- **Gerar. Compor. Testar. Verificar. Empacotar.**
9
+ ## Core Positioning
10
10
 
11
- Leia a direção geral do produto em [PRODUCT_VISION.md](./PRODUCT_VISION.md).
11
+ Semmet Angular is not a visual design system.
12
12
 
13
- English documentation is available in [README.en.md](./README.en.md).
13
+ It generates accessible Angular building blocks with semantic HTML, ARIA wiring, keyboard/focus behavior, signal-based state, and minimal functional CSS. The consuming project owns the final layout, spacing, typography, color, radius, shadow, motion, and brand expression.
14
14
 
15
- `ng generate semmet-angular:accordion minha-faq` cria um componente Angular standalone baseado em signals — `.ts`/`.html`/`.css` — junto com testes `.spec.ts` e `.e2e-spec.ts`. O componente gerado implementa de verdade um padrão do W3C ARIA Authoring Practices Guide: roles corretos, ligação de atributos `aria-*`, comportamento de teclado/foco exigido pelo padrão (navegação por setas, focus trap, restauração de foco...) e uma identidade visual consistente logo de saída.
15
+ Use isolated components for precise application UI, and optional starter blocks for common editable section scaffolds.
16
16
 
17
- ## Uso
17
+ ## Usage
18
18
 
19
19
  ```bash
20
20
  ng add semmet-angular
21
- ng generate semmet-angular:accordion minha-faq
21
+ ng generate semmet-angular:button cta-button
22
+ ng generate semmet-angular:list-group feature-list
22
23
  ng generate semmet-angular:block section-card
23
24
  ng generate semmet-angular:ci
24
25
  ng generate semmet-angular:docker
25
26
  ng generate semmet-angular:deploy
26
27
  ```
27
28
 
28
- `ng add semmet-angular` instala o pacote e configura uma vez o fluxo de entrega da aplicação alvo, incluindo suporte a e2e com Playwright, scripts npm e `npm run verify`. Cada componente gerado entra no seu projeto do mesmo jeito que entraria com `ng generate component` (respeitando `angular.json`, `sourceRoot` e prefixo de seletor), e tem **zero dependência em tempo de execução** deste pacote — `semmet-angular` só é necessário na geração.
29
+ Generated components are standalone Angular files:
29
30
 
30
- ## Arquitetura em Camadas
31
-
32
- Use componentes isolados quando precisar de controle fino, ou compositions quando quiser acelerar telas acessíveis com estrutura já validada.
33
-
34
- - **Components**: componentes isolados como `button`, `card`, `accordion`, `table` e `navbar`.
35
- - **Compositions / Blocks**: seções prontas como `section-card`, `section-faq`, `section-pricing`, `section-stats`, `section-table`, `section-form`, `section-tabs`, `section-list-group`, `section-alert`, `section-progress`, `section-carousel`, `header-navbar`, `footer-navigation` e `command-list`.
36
- - **Delivery**: `ng add`, `ci`, `docker`, `deploy` e `verify`.
37
-
38
- ## Comandos de Composição
39
-
40
- Compositions/blocks geram seções Angular standalone usando os componentes correspondentes da própria Semmet. O CSS gerado fica local no block e usa tokens locais de espaçamento para manter ritmo de landing page sem injetar estilo global na aplicação.
41
-
42
- | Comando | Gera | Usa como base |
43
- |---|---|---|
44
- | `ng generate semmet-angular:block hero` | Seção hero semântica | Estrutura de seção |
45
- | `ng generate semmet-angular:block section-card` | Seção de cards | `card` |
46
- | `ng generate semmet-angular:block section-faq` | Seção de FAQ | `accordion` |
47
- | `ng generate semmet-angular:block section-pricing` | Seção de preços | `card` |
48
- | `ng generate semmet-angular:block section-stats` | Seção de métricas | Estrutura de seção |
49
- | `ng generate semmet-angular:block section-table` | Seção com tabela | `table` |
50
- | `ng generate semmet-angular:block section-form` | Seção com formulário | `form` |
51
- | `ng generate semmet-angular:block section-tabs` | Seção com abas | `tabs` |
52
- | `ng generate semmet-angular:block section-list-group` | Seção com lista de ações | `list-group` |
53
- | `ng generate semmet-angular:block section-alert` | Seção com alerta | `alert` |
54
- | `ng generate semmet-angular:block section-progress` | Seção com progresso | `progress-bar` |
55
- | `ng generate semmet-angular:block section-carousel` | Seção com carousel | `carousel` |
56
- | `ng generate semmet-angular:block header-navbar` | Header com navegação | `navbar` |
57
- | `ng generate semmet-angular:block footer-navigation` | Footer com navegação | `navbar` |
58
- | `ng generate semmet-angular:block command-list` | Seção de comandos | Estrutura de seção |
59
-
60
- ## Fluxo de Entrega
61
-
62
- Depois de rodar `ng add semmet-angular`, use:
63
-
64
- ```bash
65
- npm test
66
- npm run e2e
67
- npm run e2e:ui
68
- npm run verify
31
+ ```text
32
+ cta-button.ts
33
+ cta-button.html
34
+ cta-button.css
35
+ cta-button.spec.ts
69
36
  ```
70
37
 
71
- `npm run e2e` executa o Playwright contra o servidor de desenvolvimento Angular configurado por `playwright.config.ts`; `npm run e2e:ui` abre a interface interativa do Playwright.
72
-
73
- O script `npm run verify` é criado sem sobrescrever um script `verify` existente. Quando os scripts estão disponíveis no `package.json` da aplicação, ele compõe um fluxo simples com:
38
+ Playwright e2e specs are opt-in:
74
39
 
75
40
  ```bash
76
- npm test -- --watch=false
77
- npm run e2e
78
- npm run build
79
- npm run lint
41
+ ng generate semmet-angular:button cta-button --e2e
80
42
  ```
81
43
 
82
- `lint` entra quando a aplicação tem um script `lint`; `build` e `test` seguem a mesma lógica. O `e2e` entra depois da configuração do Playwright feita pelo `ng add`.
44
+ Only pass `--e2e` when the consuming app has Playwright configured. The current roadmap is to move Playwright setup into an explicit schematic instead of doing it by default in `ng add`.
83
45
 
84
- ## CI com GitHub Actions
46
+ ## Components vs Starter Blocks
85
47
 
86
- ```bash
87
- ng generate semmet-angular:ci
88
- ```
48
+ ### Components
89
49
 
90
- Esse comando gera `.github/workflows/ci.yml` usando os scripts existentes no `package.json`. O workflow usa Node 24, detecta o gerenciador de pacotes por lockfile (`package-lock.json`, `pnpm-lock.yaml` ou `yarn.lock`), instala dependências e executa `verify` quando disponível. Se `verify` ainda não existir, ele roda `build`, `test` e `e2e` conforme esses scripts existirem.
50
+ Components and directives are the core of Semmet Angular. They are the best choice when the consuming application needs precise control over markup, layout, and visual design.
91
51
 
92
- Quando o projeto usa Playwright, o CI também instala o Chromium com `playwright install --with-deps chromium` e cacheia `~/.cache/ms-playwright` com `actions/cache`, reduzindo o tempo das execuções seguintes.
52
+ They provide the accessibility contract while leaving layout and visual design to the application:
93
53
 
94
- Por padrão, o comando não sobrescreve um workflow existente. Use `--force` quando quiser substituir `.github/workflows/ci.yml`.
54
+ - semantic root elements where the native element matters;
55
+ - headless directives where accessibility comes from relationships between elements;
56
+ - ARIA attributes and accessible names/descriptions;
57
+ - keyboard and focus behavior;
58
+ - signal-based state;
59
+ - projected rich content through `ng-template` when needed;
60
+ - open visual inputs such as `variant` and `size` as `string`, not closed visual unions.
95
61
 
96
- ## Empacotamento com Docker
62
+ Examples:
97
63
 
98
64
  ```bash
99
- ng generate semmet-angular:docker
65
+ ng generate semmet-angular:button save-button
66
+ ng generate semmet-angular:card testimonial-card
67
+ ng generate semmet-angular:input-group search-box
68
+ ng generate semmet-angular:list-group feature-list
69
+ ng generate semmet-angular:tabs settings-tabs
100
70
  ```
101
71
 
102
- Esse comando gera `Dockerfile`, `.dockerignore` e `nginx.conf` para empacotar a aplicação Angular como uma imagem servida por Nginx. O Dockerfile usa Node 24 no estágio de build, detecta o gerenciador de pacotes por lockfile, executa o build e copia o output configurado no `angular.json` para `/usr/share/nginx/html`.
103
-
104
- O `nginx.conf` inclui fallback de SPA com `try_files ... /index.html`. Por padrão, o comando não sobrescreve arquivos existentes; use `--force` para substituir a configuração Docker atual.
72
+ ### Starter Blocks
105
73
 
106
- ## Deploy Guiado
107
-
108
- ```bash
109
- ng generate semmet-angular:deploy
110
- ```
74
+ Blocks are optional section scaffolds. They are useful for fast first drafts, common marketing/product sections, and quick app structure.
111
75
 
112
- O comando pergunta qual plataforma você quer usar e gera a configuração mínima para o destino escolhido. Também para passar a plataforma direto:
76
+ They are not a public UI API and they are not meant to preserve a Semmet layout. A generated block is local application code. If the target UI needs a different structure, replace the block markup or switch to isolated components.
113
77
 
114
78
  ```bash
115
- ng generate semmet-angular:deploy --platform=vercel
116
- ng generate semmet-angular:deploy --platform=netlify
117
- ng generate semmet-angular:deploy --platform=firebase
118
- ng generate semmet-angular:deploy --platform=github-pages
119
- ng generate semmet-angular:deploy --platform=docker
79
+ ng generate semmet-angular:block hero
80
+ ng generate semmet-angular:block section-card
81
+ ng generate semmet-angular:block section-pricing
82
+ ng generate semmet-angular:block section-table
83
+ ng generate semmet-angular:block section-form
84
+ ng generate semmet-angular:block section-tabs
85
+ ng generate semmet-angular:block section-list-group
86
+ ng generate semmet-angular:block header-navbar
87
+ ng generate semmet-angular:block footer-navigation
120
88
  ```
121
89
 
122
- Destinos suportados: Vercel (`vercel.json`), Netlify (`netlify.toml`), Firebase Hosting (`firebase.json` e `.firebaserc`), GitHub Pages (`.github/workflows/deploy.yml`) e deploy baseado em Docker (`compose.yml` e `deploy/docker.README.md`). O comando detecta o output do build no `angular.json` quando possível e não sobrescreve arquivos existentes sem `--force`.
123
-
124
- ## Testes Gerados
90
+ Generated block HTML includes an inline comment reminding developers that the scaffold is editable and replaceable.
125
91
 
126
- Todo comando de componente gera arquivos de teste ao lado do componente:
127
-
128
- ```text
129
- minha-faq.ts
130
- minha-faq.html
131
- minha-faq.css
132
- minha-faq.spec.ts
133
- minha-faq.e2e-spec.ts
134
- ```
92
+ ## Minimal Functional CSS
135
93
 
136
- O teste unitário usa o `TestBed` do Angular para verificar o componente pelo seletor público. Componentes interativos também geram testes focados em comportamento: estado ARIA, fluxo de teclado, mudanças de valor, gerenciamento de foco e abertura/fechamento. O teste e2e usa Playwright e passa a valer assim que o componente estiver montado em uma rota ou componente host. Se o componente ainda não estiver em nenhuma página renderizada, o smoke test e2e gerado é pulado com uma mensagem clara, sem quebrar a suíte inteira.
94
+ Generated CSS is intentionally sparse.
137
95
 
138
- ## Containers com Conteúdo Projetado
96
+ Keep CSS only when it supports structure, behavior, or accessibility:
139
97
 
140
- Alguns componentes gerados são containers: eles cuidam da ligação ARIA, comportamento de teclado, gerenciamento de foco e casca visual, enquanto a sua aplicação controla o conteúdo renderizado dentro deles.
98
+ - open/closed state;
99
+ - overlay positioning;
100
+ - visible focus;
101
+ - hidden content;
102
+ - native-control inheritance;
103
+ - basic box behavior needed by the component.
141
104
 
142
- `accordion`, `tabs`, `carousel`, `disclosure`, `card`, `button`, `badge`, `navbar`, `table` e `button-group` usam o padrão moderno de projeção do Angular com `ng-template`, signal queries e `NgTemplateOutlet`. Isso permite colocar componentes reais da aplicação dentro dos componentes gerados sem factories de componente dinâmico.
105
+ Do not treat generated CSS as a theme. Typography, color, radius, shadow, decorative borders, visual hover states, spacing rhythm, and final layout belong to the consuming project.
143
106
 
144
- Exemplo depois de gerar `faq`:
107
+ ## Projected Content
145
108
 
146
- ```ts
147
- import { Component, signal } from '@angular/core';
148
- import { Faq, FaqItem } from './faq/faq';
149
- import { ProfilePanel } from './profile-panel/profile-panel';
150
- import { SettingsPanel } from './settings-panel/settings-panel';
109
+ Rich content uses Angular projection patterns instead of string-only APIs.
151
110
 
152
- @Component({
153
- selector: 'app-root',
154
- imports: [Faq, FaqItem, ProfilePanel, SettingsPanel],
155
- templateUrl: './app.html',
156
- })
157
- export class App {
158
- readonly userId = signal(123);
159
-
160
- reload(): void {}
161
- }
162
- ```
111
+ Example after generating `search-box`:
163
112
 
164
113
  ```html
165
- <app-faq>
166
- <ng-template faqItem id="profile" title="Perfil" [expanded]="true">
167
- <app-profile-panel />
114
+ <app-search-box label="Search" type="search" [(value)]="query">
115
+ <ng-template searchBoxPrefix>
116
+ <app-search-icon aria-hidden="true" />
168
117
  </ng-template>
169
118
 
170
- <ng-template faqItem id="settings" title="Configurações">
171
- <app-settings-panel [userId]="userId()" (saved)="reload()" />
119
+ <ng-template searchBoxSuffix>
120
+ {{ query().length }}
172
121
  </ng-template>
173
- </app-faq>
122
+ </app-search-box>
174
123
  ```
175
124
 
176
- O mesmo padrão vale para `tabs`, `carousel` e `disclosure`:
125
+ Example after generating `testimonial-card`:
177
126
 
178
127
  ```html
179
- <app-settings-tabs>
180
- <ng-template settingsTabsItem id="profile" label="Perfil" [selected]="true">
181
- <app-profile-panel />
182
- </ng-template>
183
- </app-settings-tabs>
184
-
185
- <app-featured-carousel>
186
- <ng-template featuredCarouselSlide id="intro" label="Introdução">
187
- <app-intro-slide />
188
- </ng-template>
189
- </app-featured-carousel>
190
-
191
- <app-details label="Mostrar detalhes do perfil" [(expanded)]="profileDetailsOpen">
192
- <ng-template detailsContent>
193
- <app-profile-details [userId]="userId()" />
194
- </ng-template>
195
- </app-details>
128
+ <app-testimonial-card>
129
+ <h3 testimonialCardHeading>Customer quote</h3>
130
+ <p>Semmet gives the accessibility structure; this app owns the content and layout.</p>
131
+ </app-testimonial-card>
196
132
  ```
197
133
 
198
- Por padrão, o conteúdo projetado de painel/slide é preservado depois da primeira renderização. Use `[preserveContent]="false"` no container gerado para destruir conteúdo inativo quando ele fechar ou ficar inativo.
199
-
200
- Os componentes estruturais menores mantêm APIs simples por input e adicionam slots seguros onde o componente gerado continua dono da estrutura acessível:
134
+ Example after generating `feature-list`:
201
135
 
202
136
  ```html
203
- <app-product-card title="Componentes acessíveis">
204
- <ng-template productCardMedia>
205
- <img src="/assets/card.png" alt="Prévia de componente Angular gerado" />
206
- </ng-template>
207
-
208
- <ng-template productCardDescription>
209
- Gere componentes Angular com ARIA, comportamento de teclado e signals.
210
- </ng-template>
211
-
212
- <ng-template productCardActions>
213
- <a href="/docs">Ler docs</a>
214
- </ng-template>
215
- </app-product-card>
216
-
217
- <app-save-button label="Salvar">
218
- <ng-template saveButtonLeading>
219
- <app-save-icon aria-hidden="true" />
220
- </ng-template>
221
- </app-save-button>
222
-
223
- <app-status-badge accessibleLabel="Build passou">
224
- <ng-template statusBadgeLabel>Passou</ng-template>
225
- </app-status-badge>
226
-
227
- <app-main-navbar brand="Acme">
228
- <ng-template mainNavbarActions>
229
- <a href="/conta">Conta</a>
230
- </ng-template>
231
- </app-main-navbar>
137
+ <ul featureList label="Pricing features" [(activeId)]="activeFeature">
138
+ @for (item of features; track item.id) {
139
+ <li
140
+ featureListItem
141
+ [value]="item.id"
142
+ #featureItem="featureListItem"
143
+ [class.active]="featureItem.active()"
144
+ >
145
+ <span>{{ item.label }}</span>
146
+ <strong>{{ item.value }}</strong>
147
+ </li>
148
+ }
149
+ </ul>
150
+ ```
232
151
 
233
- <app-results-table caption="Receita trimestral" [rows]="results">
234
- <ng-template resultsTableEmpty>Nenhum resultado de receita ainda.</ng-template>
235
- </app-results-table>
152
+ ## Delivery Schematics
236
153
 
237
- <app-view-switcher [items]="views">
238
- <ng-template viewSwitcherItem let-item>
239
- {{ item.label }}
240
- </ng-template>
241
- </app-view-switcher>
154
+ ```bash
155
+ ng generate semmet-angular:ci
156
+ ng generate semmet-angular:docker
157
+ ng generate semmet-angular:deploy
242
158
  ```
243
159
 
244
- ## Componentes, Blocks e Entrega (43)
245
-
246
- **Overlays e disclosure**
247
-
248
- | Comando | Gera | Comportamento de teclado/foco implementado |
249
- |---|---|---|
250
- | `ng generate semmet-angular:accordion <nome>` | [Accordion](https://www.w3.org/WAI/ARIA/apg/patterns/accordion/) | Clique/Enter/Espaço alterna; Cima/Baixo/Home/End move foco entre cabeçalhos |
251
- | `ng generate semmet-angular:disclosure <nome>` | [Disclosure](https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/) | Clique/Enter/Espaço alterna |
252
- | `ng generate semmet-angular:dialog <nome>` | [Dialog (Modal)](https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/) | Foco entra ao abrir; Tab/Shift+Tab prende o foco; Escape fecha; foco volta para o acionador |
253
- | `ng generate semmet-angular:alert-dialog <nome>` | [Alert Dialog](https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/) | Mesmo focus trap do Dialog; foco inicial na ação menos destrutiva (Cancelar) |
254
- | `ng generate semmet-angular:offcanvas <nome>` | Offcanvas / Drawer | Semântica de dialog modal; foco entra; Tab/Shift+Tab prende o foco; Escape/backdrop fecha; foco volta para o acionador |
255
- | `ng generate semmet-angular:popover <nome>` | Popover | Acionador disclosure com `aria-haspopup="dialog"`; Escape fecha; clique externo dispensa |
256
- | `ng generate semmet-angular:tooltip <nome>` | [Tooltip](https://www.w3.org/WAI/ARIA/apg/patterns/tooltip/) | Aparece no hover **e** no foco; esconde no blur/mouseleave/Escape |
257
- | `ng generate semmet-angular:menu-button <nome>` | [Menu Button](https://www.w3.org/WAI/ARIA/apg/patterns/menu-button/) | Cima/Baixo/Home/End/Escape dentro do menu; fecha em clique externo; foco volta para o acionador |
258
- | `ng generate semmet-angular:button <nome>` | Button | `<button>` nativo com variante, tamanho, desabilitado, ocupado, estado pressionado opcional e slots seguros de rótulo/ícone |
259
- | `ng generate semmet-angular:button-group <nome>` | Button Group | Botões nativos agrupados com `role="group"`, estado toggle opcional com `aria-pressed` e projeção segura de rótulo por item |
260
- | `ng generate semmet-angular:close-button <nome>` | Close Button | Botão de ícone nativo com rótulo acessível obrigatório |
261
-
262
- **Navegação e estrutura**
263
-
264
- | Comando | Gera | Comportamento de teclado/foco implementado |
265
- |---|---|---|
266
- | `ng generate semmet-angular:tabs <nome>` | [Tabs](https://www.w3.org/WAI/ARIA/apg/patterns/tabs/) | Ativação automática; Esquerda/Direita/Home/End com `tabindex` roving |
267
- | `ng generate semmet-angular:breadcrumb <nome>` | [Breadcrumb](https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/) | Estático — links simples + `aria-current="page"` |
268
- | `ng generate semmet-angular:navigation-menu <nome>` | [Navigation Menu (Disclosure)](https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/examples/disclosure-navigation/) | Clique/Enter/Espaço alterna submenu; evita `role="menu"` de propósito, reservado para menus de aplicação |
269
- | `ng generate semmet-angular:navbar <nome>` | Navbar | Estrutura semântica `nav`/lista/link com toggle responsivo, `aria-current` e slots seguros de marca/ações |
270
- | `ng generate semmet-angular:pagination <nome>` | Pagination | Estado de página funcional; Anterior/Próximo desabilitam nos limites |
271
- | `ng generate semmet-angular:skip-link <nome>` | [Skip Link](https://www.w3.org/WAI/WCAG21/Techniques/general/G1) | Escondido até receber foco, conforme o padrão de skip link |
272
- | `ng generate semmet-angular:landmarks <nome>` | [Landmarks (Page Skeleton)](https://www.w3.org/WAI/ARIA/apg/practices/landmark-regions/) | Wrapper de layout com projeção de conteúdo (`header`/`nav`/`main`/`aside`/`footer`) |
273
- | `ng generate semmet-angular:tree-view <nome>` | [Tree View](https://www.w3.org/WAI/ARIA/apg/patterns/treeview/) | Cima/Baixo/Esquerda/Direita/Home/End/Enter com `tabindex` roving nos nós visíveis |
274
- | `ng generate semmet-angular:toolbar <nome>` | [Toolbar](https://www.w3.org/WAI/ARIA/apg/patterns/toolbar/) | Esquerda/Direita/Home/End com `tabindex` roving |
275
- | `ng generate semmet-angular:card <nome>` | Card | `<article>` semântico com heading/descrição/ações/mídia e slots seguros |
276
- | `ng generate semmet-angular:list-group <nome>` | List Group | Estrutura semântica de lista com itens de ação, estado ativo, badges opcionais e estados desabilitados |
277
- | `ng generate semmet-angular:table <nome>` | [Table](https://www.w3.org/WAI/ARIA/apg/patterns/table/) | Caption + cabeçalhos escopados, linhas por input e slots seguros de caption/estado vazio |
278
-
279
- **Formulários e inputs**
280
-
281
- | Comando | Gera | Comportamento de teclado/foco implementado |
282
- |---|---|---|
283
- | `ng generate semmet-angular:form <nome>` | Form | `<form>` nativo com controles rotulados, validação inline e mensagens de status |
284
- | `ng generate semmet-angular:input <nome>` | Input | `<input>` nativo com label, dica, mensagem de validação e valor com signal |
285
- | `ng generate semmet-angular:select <nome>` | Select | `<select>` nativo com label, dica, mensagem de validação e valor com signal |
286
- | `ng generate semmet-angular:input-group <nome>` | Input Group | `<input>` nativo com prefixo/sufixo anunciados por `aria-describedby` e botão de ação opcional |
287
- | `ng generate semmet-angular:textarea <nome>` | Textarea | `<textarea>` nativo com label, dica, contador, mensagem de validação e valor com signal |
288
- | `ng generate semmet-angular:checkbox <nome>` | [Checkbox](https://www.w3.org/WAI/ARIA/apg/patterns/checkbox/) | Clique/Enter/Espaço alterna |
289
- | `ng generate semmet-angular:radio-group <nome>` | [Radio Group](https://www.w3.org/WAI/ARIA/apg/patterns/radio/) | Cima/Baixo/Esquerda/Direita/Home/End movem foco e seleção juntos |
290
- | `ng generate semmet-angular:switch <nome>` | [Switch](https://www.w3.org/WAI/ARIA/apg/patterns/switch/) | `<button>` nativo — Clique/Enter/Espaço alterna |
291
- | `ng generate semmet-angular:combobox <nome>` | [Combobox](https://www.w3.org/WAI/ARIA/apg/patterns/combobox/) | Filtro em tempo real; Cima/Baixo/Home/End/Enter/Escape via `aria-activedescendant` |
292
- | `ng generate semmet-angular:listbox <nome>` | [Listbox](https://www.w3.org/WAI/ARIA/apg/patterns/listbox/) | Cima/Baixo/Home/End via `aria-activedescendant` |
293
- | `ng generate semmet-angular:slider <nome>` | [Slider](https://www.w3.org/WAI/ARIA/apg/patterns/slider/) | Setas/PageUp/PageDown/Home/End, além de arraste por ponteiro |
294
- | `ng generate semmet-angular:spinbutton <nome>` | [Spinbutton](https://www.w3.org/WAI/ARIA/apg/patterns/spinbutton/) | Cima/Baixo/Home/End, além de botões incrementar/decrementar |
295
- | `ng generate semmet-angular:meter <nome>` | [Meter](https://www.w3.org/TR/wai-aria-1.2/#meter) | Estático — `<meter>` nativo ligado a um signal |
296
- | `ng generate semmet-angular:progress-bar <nome>` | [Progress Bar](https://www.w3.org/TR/wai-aria-1.2/#progressbar) | `<progress>` nativo ligado a um signal |
297
-
298
- **Feedback e mídia**
299
-
300
- | Comando | Gera | Comportamento de teclado/foco implementado |
301
- |---|---|---|
302
- | `ng generate semmet-angular:alert <nome>` | [Alert](https://www.w3.org/WAI/ARIA/apg/patterns/alert/) | Região live assertiva e dispensável |
303
- | `ng generate semmet-angular:toast <nome>` | Toast / Notification | Auto-dismiss após 5s (limpo via `DestroyRef`); pode ser dispensado antes |
304
- | `ng generate semmet-angular:skeleton <nome>` | Skeleton Loading | Placeholder de carregamento composível para texto, mídia, círculos, cards e blocos customizados |
305
- | `ng generate semmet-angular:badge <nome>` | Badge | Rótulo/contador compacto com modo decorativo, rótulo acessível opcional e projeção segura de label |
306
- | `ng generate semmet-angular:spinner <nome>` | Spinner | Status de carregamento com `role="status"`, rótulo visualmente escondido por padrão e suporte a reduced motion |
307
- | `ng generate semmet-angular:carousel <nome>` | [Carousel](https://www.w3.org/WAI/ARIA/apg/patterns/carousel/) | Controles Anterior/Próximo; região de slide com `aria-live="polite"` |
308
-
309
- ## Como Cada Componente Gerado É
310
-
311
- - Standalone (implícito — sem `standalone: true`, alinhado ao padrão atual do Angular).
312
- - Estado via `signal()`/`computed()`, não campos simples de classe.
313
- - Templates usam o control flow embutido (`@for`, `@if`), não `*ngFor`/`*ngIf`.
314
- - Sem sufixo `.component` nos nomes de arquivos ou classes (`accordion.ts`, `export class Accordion`), seguindo a convenção atual de `ng generate component`.
315
- - Id único por instância (`<nome>-0`, `<nome>-1`, ...) para múltiplas instâncias do mesmo componente nunca colidirem em `id`/`aria-controls`/`aria-labelledby`.
316
- - Teste unitário (`.spec.ts`) e smoke test e2e Playwright (`.e2e-spec.ts`) gerados para o componente já nascer com uma superfície de teste.
317
-
318
- ## Identidade Visual
319
-
320
- Todo componente gerado compartilha um visual inspirado em Material Design — superfícies limpas, elevação sutil e escala consistente de raio/movimento — usando sua própria paleta de cores (não as cores do Material, para evitar qualquer risco de cópia visual). Os tokens são CSS custom properties declaradas no `:host` de cada componente (por exemplo, `--semmet-color-primary`, `--semmet-radius-md`, `--semmet-elevation-1`), então você pode usar os defaults como estão ou sobrescrever a família inteira em uma stylesheet global sem tocar nos arquivos gerados.
321
-
322
- ## Opções
323
-
324
- Todo comando de componente aceita as mesmas três opções de `ng generate component`:
325
-
326
- - `name` (obrigatório, posicional) — nome do componente.
327
- - `project` — projeto alvo; por padrão, usa o projeto atual/default.
328
- - `path` — diretório alvo; por padrão, usa `src/app` do projeto.
329
-
330
- ## Licença
160
+ The delivery schematics are explicit and optional:
161
+
162
+ - `ci` generates a GitHub Actions workflow from existing package scripts.
163
+ - `docker` generates Docker/Nginx packaging files for an Angular SPA.
164
+ - `deploy` generates minimal deployment configuration for supported platforms.
165
+
166
+ ## Available Component Commands
167
+
168
+ Overlays and disclosure:
169
+
170
+ - `accordion`
171
+ - `alert-dialog`
172
+ - `dialog`
173
+ - `disclosure`
174
+ - `menu-button`
175
+ - `offcanvas`
176
+ - `popover`
177
+ - `tooltip`
178
+
179
+ Navigation and structure:
180
+
181
+ - `breadcrumb`
182
+ - `card`
183
+ - `landmarks`
184
+ - `list-group`
185
+ - `navbar`
186
+ - `navigation-menu`
187
+ - `pagination`
188
+ - `skip-link`
189
+ - `tabs`
190
+ - `toolbar`
191
+ - `tree-view`
192
+
193
+ Forms and inputs:
194
+
195
+ - `checkbox`
196
+ - `combobox`
197
+ - `form`
198
+ - `input`
199
+ - `input-group`
200
+ - `listbox`
201
+ - `meter`
202
+ - `progress-bar`
203
+ - `radio-group`
204
+ - `select`
205
+ - `slider`
206
+ - `spinbutton`
207
+ - `switch`
208
+ - `textarea`
209
+
210
+ Feedback, media, and display:
211
+
212
+ - `alert`
213
+ - `avatar`
214
+ - `badge`
215
+ - `button`
216
+ - `button-group`
217
+ - `carousel`
218
+ - `close-button`
219
+ - `rating`
220
+ - `skeleton`
221
+ - `spinner`
222
+ - `steps`
223
+ - `table`
224
+ - `toast`
225
+
226
+ ## Options
227
+
228
+ Common component options:
229
+
230
+ - `name` required, positional.
231
+ - `project` target Angular project.
232
+ - `path` target directory.
233
+ - `e2e` optional boolean. Generates a Playwright spec only when explicitly requested.
234
+
235
+ ## License
331
236
 
332
237
  MIT
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "semmet-angular",
3
- "version": "0.42.0",
3
+ "version": "0.43.0",
4
4
  "description": "Accessible UI delivery dev kit in Angular: schematics that generate components, compositions, tests, and delivery scaffolds as native editable Angular code.",
5
5
  "publisher": "danilodevsilva",
6
6
  "license": "MIT",
@@ -25,8 +25,8 @@
25
25
  },
26
26
  "schematics": "./src/collection.json",
27
27
  "files": [
28
+ "README.md",
28
29
  "README.en.md",
29
- "README.pt-BR.md",
30
30
  "src",
31
31
  "!src/**/*_spec.ts",
32
32
  "!src/**/*_spec.js",
@@ -1,57 +1,26 @@
1
1
  :host {
2
- --semmet-color-primary: #18181b;
3
- --semmet-color-surface: #ffffff;
4
- --semmet-color-outline: #d4d4d8;
5
- --semmet-color-on-surface: #18181b;
6
- --semmet-color-on-surface-variant: #52525b;
7
- --semmet-radius-md: 12px;
8
- --semmet-space-2xs: 8px;
9
- --semmet-space-xs: 16px;
10
- --semmet-space-sm: 24px;
11
- --semmet-motion: 160ms cubic-bezier(0.2, 0, 0, 1);
12
-
13
2
  display: block;
14
- font-family: Roboto, system-ui, -apple-system, 'Segoe UI', sans-serif;
15
- font-size: 0.9375rem;
16
- line-height: 1.5;
17
- color: var(--semmet-color-on-surface);
18
- background: var(--semmet-color-surface);
19
- border: 1px solid var(--semmet-color-outline);
20
- border-radius: var(--semmet-radius-md);
21
- overflow: hidden;
22
3
  }
23
4
 
24
5
  h3 {
25
6
  margin: 0;
26
7
  }
27
8
 
28
- h3:not(:first-of-type) {
29
- border-top: 1px solid var(--semmet-color-outline);
30
- }
31
-
32
9
  button {
33
10
  display: flex;
34
11
  align-items: center;
35
- gap: var(--semmet-space-xs);
36
12
  width: 100%;
37
- padding: var(--semmet-space-xs) var(--semmet-space-sm);
38
13
  font: inherit;
39
- font-weight: 500;
40
14
  color: inherit;
41
15
  background: none;
42
16
  border: none;
43
17
  cursor: pointer;
44
18
  text-align: left;
45
- transition: background-color var(--semmet-motion);
46
- }
47
-
48
- button:hover {
49
- background: color-mix(in srgb, var(--semmet-color-on-surface) 6%, transparent);
50
19
  }
51
20
 
52
21
  button:focus-visible {
53
- outline: 2px solid var(--semmet-color-primary);
54
- outline-offset: -2px;
22
+ outline: 2px solid currentColor;
23
+ outline-offset: 2px;
55
24
  }
56
25
 
57
26
  button::after {
@@ -60,17 +29,11 @@ button::after {
60
29
  height: 0.5rem;
61
30
  margin-left: auto;
62
31
  flex-shrink: 0;
63
- border-right: 2px solid var(--semmet-color-on-surface-variant);
64
- border-bottom: 2px solid var(--semmet-color-on-surface-variant);
32
+ border-right: 2px solid currentColor;
33
+ border-bottom: 2px solid currentColor;
65
34
  transform: rotate(45deg);
66
- transition: transform var(--semmet-motion);
67
35
  }
68
36
 
69
37
  button[aria-expanded='true']::after {
70
38
  transform: rotate(-135deg);
71
39
  }
72
-
73
- [role='region'] {
74
- padding: 0 var(--semmet-space-sm) var(--semmet-space-sm);
75
- color: var(--semmet-color-on-surface-variant);
76
- }