@sekiui/elements 0.0.14 → 0.0.16

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 (119) hide show
  1. package/README.md +421 -14
  2. package/dist/cjs/app-globals-V2Kpy_OQ.js +5 -0
  3. package/dist/{esm/index-3X8Wsgjr.js → cjs/index-6jIfEFyf.js} +32 -54
  4. package/dist/cjs/index.cjs.js +0 -1
  5. package/dist/cjs/loader.cjs.js +4 -4
  6. package/dist/cjs/seki-button.cjs.entry.js +6 -31
  7. package/dist/cjs/sekiui.cjs.js +5 -5
  8. package/dist/collection/collection-manifest.json +2 -6
  9. package/dist/collection/components/button/seki-button.css +380 -0
  10. package/dist/collection/components/button/seki-button.js +108 -0
  11. package/dist/collection/index.js +0 -1
  12. package/dist/components/index.js +1130 -3
  13. package/dist/components/seki-button.js +10 -35
  14. package/dist/esm/app-globals-DQuL1Twl.js +3 -0
  15. package/dist/{cjs/index-BxbILFLe.js → esm/index-BROrRAlq.js} +27 -81
  16. package/dist/esm/index.js +0 -1
  17. package/dist/esm/loader.js +4 -4
  18. package/dist/esm/seki-button.entry.js +6 -31
  19. package/dist/esm/sekiui.js +5 -5
  20. package/dist/index.js +1 -2
  21. package/dist/sekiui/index.esm.js +0 -2
  22. package/dist/sekiui/p-BROrRAlq.js +2 -0
  23. package/dist/sekiui/p-DQuL1Twl.js +1 -0
  24. package/dist/sekiui/p-e65a94f7.entry.js +1 -0
  25. package/dist/sekiui/sekiui.esm.js +1 -2
  26. package/dist/types/components/button/seki-button.d.ts +7 -0
  27. package/dist/types/components.d.ts +16 -62
  28. package/dist/types/index.d.ts +1 -1
  29. package/dist/types/stencil-public-runtime.d.ts +16 -2
  30. package/package.json +42 -33
  31. package/LICENSE +0 -21
  32. package/dist/cjs/index-BxbILFLe.js.map +0 -1
  33. package/dist/cjs/index.cjs.js.map +0 -1
  34. package/dist/cjs/loader.cjs.js.map +0 -1
  35. package/dist/cjs/seki-button.entry.cjs.js.map +0 -1
  36. package/dist/cjs/seki-card-content.cjs.entry.js +0 -18
  37. package/dist/cjs/seki-card-content.entry.cjs.js.map +0 -1
  38. package/dist/cjs/seki-card-header.cjs.entry.js +0 -18
  39. package/dist/cjs/seki-card-header.entry.cjs.js.map +0 -1
  40. package/dist/cjs/seki-card-title.cjs.entry.js +0 -18
  41. package/dist/cjs/seki-card-title.entry.cjs.js.map +0 -1
  42. package/dist/cjs/seki-card.cjs.entry.js +0 -18
  43. package/dist/cjs/seki-card.entry.cjs.js.map +0 -1
  44. package/dist/cjs/sekiui.cjs.js.map +0 -1
  45. package/dist/collection/button.js +0 -18
  46. package/dist/collection/button.js.map +0 -1
  47. package/dist/collection/card.js +0 -18
  48. package/dist/collection/card.js.map +0 -1
  49. package/dist/collection/components/seki-button/seki-button.css +0 -60
  50. package/dist/collection/components/seki-button/seki-button.js +0 -125
  51. package/dist/collection/components/seki-button/seki-button.js.map +0 -1
  52. package/dist/collection/components/seki-card/seki-card.css +0 -60
  53. package/dist/collection/components/seki-card/seki-card.js +0 -19
  54. package/dist/collection/components/seki-card/seki-card.js.map +0 -1
  55. package/dist/collection/components/seki-card-content/seki-card-content.css +0 -60
  56. package/dist/collection/components/seki-card-content/seki-card-content.js +0 -19
  57. package/dist/collection/components/seki-card-content/seki-card-content.js.map +0 -1
  58. package/dist/collection/components/seki-card-header/seki-card-header.css +0 -60
  59. package/dist/collection/components/seki-card-header/seki-card-header.js +0 -19
  60. package/dist/collection/components/seki-card-header/seki-card-header.js.map +0 -1
  61. package/dist/collection/components/seki-card-title/seki-card-title.css +0 -60
  62. package/dist/collection/components/seki-card-title/seki-card-title.js +0 -19
  63. package/dist/collection/components/seki-card-title/seki-card-title.js.map +0 -1
  64. package/dist/collection/index.js.map +0 -1
  65. package/dist/components/index.js.map +0 -1
  66. package/dist/components/seki-button.js.map +0 -1
  67. package/dist/components/seki-card-content.d.ts +0 -11
  68. package/dist/components/seki-card-content.js +0 -38
  69. package/dist/components/seki-card-content.js.map +0 -1
  70. package/dist/components/seki-card-header.d.ts +0 -11
  71. package/dist/components/seki-card-header.js +0 -38
  72. package/dist/components/seki-card-header.js.map +0 -1
  73. package/dist/components/seki-card-title.d.ts +0 -11
  74. package/dist/components/seki-card-title.js +0 -38
  75. package/dist/components/seki-card-title.js.map +0 -1
  76. package/dist/components/seki-card.d.ts +0 -11
  77. package/dist/components/seki-card.js +0 -38
  78. package/dist/components/seki-card.js.map +0 -1
  79. package/dist/esm/index-3X8Wsgjr.js.map +0 -1
  80. package/dist/esm/index.js.map +0 -1
  81. package/dist/esm/loader.js.map +0 -1
  82. package/dist/esm/seki-button.entry.js.map +0 -1
  83. package/dist/esm/seki-card-content.entry.js +0 -16
  84. package/dist/esm/seki-card-content.entry.js.map +0 -1
  85. package/dist/esm/seki-card-header.entry.js +0 -16
  86. package/dist/esm/seki-card-header.entry.js.map +0 -1
  87. package/dist/esm/seki-card-title.entry.js +0 -16
  88. package/dist/esm/seki-card-title.entry.js.map +0 -1
  89. package/dist/esm/seki-card.entry.js +0 -16
  90. package/dist/esm/seki-card.entry.js.map +0 -1
  91. package/dist/esm/sekiui.js.map +0 -1
  92. package/dist/sekiui/index.esm.js.map +0 -1
  93. package/dist/sekiui/loader.esm.js.map +0 -1
  94. package/dist/sekiui/p-043a8413.entry.js +0 -2
  95. package/dist/sekiui/p-043a8413.entry.js.map +0 -1
  96. package/dist/sekiui/p-3X8Wsgjr.js +0 -3
  97. package/dist/sekiui/p-3X8Wsgjr.js.map +0 -1
  98. package/dist/sekiui/p-65fc14ff.entry.js +0 -2
  99. package/dist/sekiui/p-65fc14ff.entry.js.map +0 -1
  100. package/dist/sekiui/p-aa468537.entry.js +0 -2
  101. package/dist/sekiui/p-aa468537.entry.js.map +0 -1
  102. package/dist/sekiui/p-c49f2aaf.entry.js +0 -2
  103. package/dist/sekiui/p-c49f2aaf.entry.js.map +0 -1
  104. package/dist/sekiui/p-e8e49693.entry.js +0 -2
  105. package/dist/sekiui/p-e8e49693.entry.js.map +0 -1
  106. package/dist/sekiui/seki-button.entry.esm.js.map +0 -1
  107. package/dist/sekiui/seki-card-content.entry.esm.js.map +0 -1
  108. package/dist/sekiui/seki-card-header.entry.esm.js.map +0 -1
  109. package/dist/sekiui/seki-card-title.entry.esm.js.map +0 -1
  110. package/dist/sekiui/seki-card.entry.esm.js.map +0 -1
  111. package/dist/sekiui/sekiui.css +0 -60
  112. package/dist/sekiui/sekiui.esm.js.map +0 -1
  113. package/dist/types/button.d.ts +0 -4
  114. package/dist/types/card.d.ts +0 -4
  115. package/dist/types/components/seki-button/seki-button.d.ts +0 -10
  116. package/dist/types/components/seki-card/seki-card.d.ts +0 -3
  117. package/dist/types/components/seki-card-content/seki-card-content.d.ts +0 -3
  118. package/dist/types/components/seki-card-header/seki-card-header.d.ts +0 -3
  119. package/dist/types/components/seki-card-title/seki-card-title.d.ts +0 -3
package/README.md CHANGED
@@ -1,25 +1,432 @@
1
- # @sekiui/elements
1
+ # SekiUI Components
2
2
 
3
- **Seki UI** short, rock-solid web components with the `seki-` prefix.
3
+ Modern, accessible Web Components library built with Stencil.js, inspired by shadcn/ui design principles.
4
4
 
5
- ## Quick start
5
+ ## Features
6
+
7
+ - 🎨 **Modern Design**: Clean, minimal components following shadcn/ui aesthetic
8
+ - ♿ **Accessibility First**: WCAG 2.1 Level AA compliant
9
+ - 🌗 **Dark Mode**: First-class dark mode support via CSS custom properties
10
+ - 📦 **Framework Agnostic**: Works with React, Vue, Angular, or vanilla JavaScript
11
+ - 🎯 **TypeScript**: Full TypeScript definitions included
12
+ - 🎭 **Storybook**: Interactive component documentation
13
+ - 🔧 **Tree-shakeable**: Import only what you need
14
+
15
+ ## Installation
16
+
17
+ ### Via npm (Recommended)
18
+
19
+ ```bash
20
+ npm install @sekiui/elements
21
+ ```
22
+
23
+ ### Via CDN (No Build Required)
24
+
25
+ For quick prototyping or projects without a build system, you can load SekiUI directly from a CDN:
26
+
27
+ **Latest Stable Version (GitHub Pages):**
6
28
  ```html
7
- <script type="module">
8
- import "@sekiui/elements"; // registers <seki-button> and <seki-card>
9
- </script>
29
+ <script type="module" src="https://sekiui.github.io/SekiUI/latest/sekiui.esm.js"></script>
30
+ ```
31
+
32
+ **Latest Stable Version (jsDelivr):**
33
+ ```html
34
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@sekiui/elements@latest/dist/sekiui.esm.js"></script>
35
+ ```
36
+
37
+ **Specific Version (GitHub Pages):**
38
+ ```html
39
+ <script type="module" src="https://sekiui.github.io/SekiUI/v1.0.0/sekiui.esm.js"></script>
40
+ ```
41
+
42
+ **Specific Version (jsDelivr):**
43
+ ```html
44
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@sekiui/elements@1.0.0/dist/sekiui.esm.js"></script>
45
+ ```
46
+
47
+ **Complete Example:**
48
+ ```html
49
+ <!DOCTYPE html>
50
+ <html lang="en">
51
+ <head>
52
+ <meta charset="UTF-8">
53
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
54
+ <title>SekiUI via CDN</title>
55
+ </head>
56
+ <body>
57
+ <!-- Load SekiUI from CDN -->
58
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@sekiui/elements@latest/dist/sekiui.esm.js"></script>
59
+
60
+ <!-- Use components directly -->
61
+ <seki-button variant="default">Click me</seki-button>
62
+ </body>
63
+ </html>
64
+ ```
65
+
66
+ **CDN Notes:**
67
+ - ✅ HTTPS enabled on all CDN URLs
68
+ - ✅ CORS headers configured for cross-origin requests
69
+ - ✅ Versioned URLs cached long-term (immutable)
70
+ - ✅ Latest URLs cached short-term (updates automatically)
71
+ - ⚠️ For production, use versioned URLs to ensure consistency
72
+
73
+ ## Usage
74
+
75
+ ### Web Components (Vanilla JS)
76
+
77
+ ```html
78
+ <script type="module" src="node_modules/@sekiui/components/dist/sekiui/sekiui.esm.js"></script>
79
+
80
+ <seki-button variant="default">Click me</seki-button>
81
+ ```
82
+
83
+ ### React
84
+
85
+ ```jsx
86
+ import { SekiButton } from '@sekiui/elements/react';
87
+
88
+ function App() {
89
+ return <SekiButton variant="default">Click me</SekiButton>;
90
+ }
91
+ ```
92
+
93
+ ### Vue
10
94
 
11
- <seki-card>
12
- <seki-button>Click me</seki-button>
13
- </seki-card>
95
+ **Option 1: Global Registration (Recommended)**
96
+
97
+ In your `main.js` or `main.ts`:
98
+
99
+ ```js
100
+ import { createApp } from 'vue';
101
+ import App from './App.vue';
102
+ import { defineCustomElements } from '@sekiui/elements/loader';
103
+
104
+ // Register custom elements once globally
105
+ defineCustomElements();
106
+
107
+ createApp(App).mount('#app');
108
+ ```
109
+
110
+ Then use anywhere in your components:
111
+
112
+ ```vue
113
+ <template>
114
+ <seki-button variant="default">Click me</seki-button>
115
+ </template>
116
+ ```
117
+
118
+ **Option 2: Component-level Registration**
119
+
120
+ ```vue
121
+ <template>
122
+ <seki-button variant="default">Click me</seki-button>
123
+ </template>
124
+
125
+ <script setup>
126
+ import { defineCustomElements } from '@sekiui/elements/loader';
127
+ defineCustomElements();
128
+ </script>
14
129
  ```
15
130
 
16
- ## Per-component imports
131
+ **Vue 3 Config (Optional):**
132
+
133
+ To prevent Vue warnings about unknown custom elements, add to `vite.config.js`:
134
+
17
135
  ```js
18
- import "@sekiui/elements/button"; // defines <seki-button> only
136
+ export default {
137
+ vue: {
138
+ template: {
139
+ compilerOptions: {
140
+ isCustomElement: (tag) => tag.startsWith('seki-')
141
+ }
142
+ }
143
+ }
144
+ }
145
+ ```
146
+
147
+ ### Angular
148
+
149
+ In your `app.module.ts`:
150
+
151
+ ```typescript
152
+ import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
153
+ import { BrowserModule } from '@angular/platform-browser';
154
+ import { defineCustomElements } from '@sekiui/elements/loader';
155
+
156
+ // Register custom elements
157
+ defineCustomElements();
158
+
159
+ @NgModule({
160
+ schemas: [CUSTOM_ELEMENTS_SCHEMA], // Tell Angular to allow custom elements
161
+ imports: [BrowserModule],
162
+ // ...
163
+ })
164
+ export class AppModule { }
165
+ ```
166
+
167
+ Then use in your templates:
168
+
169
+ ```html
170
+ <seki-button variant="default">Click me</seki-button>
171
+ ```
172
+
173
+ ## Development Setup
174
+
175
+ ### Prerequisites
176
+
177
+ - Node.js 20.x or later
178
+ - npm or yarn
179
+
180
+ ### Install Dependencies
181
+
182
+ ```bash
183
+ npm install
184
+ ```
185
+
186
+ ### Development Server
187
+
188
+ ```bash
189
+ npm start
190
+ ```
191
+
192
+ ### Build
193
+
194
+ ```bash
195
+ npm run build
196
+ ```
197
+
198
+ ### Storybook
199
+
200
+ ```bash
201
+ npm run storybook
202
+ ```
203
+
204
+ ### Version Management Tool
205
+
206
+ For accurate version comparison when creating releases, install the `semver` CLI globally:
207
+
208
+ ```bash
209
+ npm install -g semver
210
+ ```
211
+
212
+ The `semver` CLI is used by the release helper script to validate that new versions are greater than the latest published version. Without it, the script falls back to basic string comparison, which may not correctly handle pre-release versions.
213
+
214
+ **Why semver?**
215
+ - Accurate semantic version comparison (handles 1.0.0-beta.1 vs 1.0.0 correctly)
216
+ - Validates version ranges and constraints
217
+ - Official npm semver library
218
+
219
+ **Fallback behavior:**
220
+ If `semver` is not installed, the release script will warn you and ask for confirmation before proceeding with basic validation.
221
+
222
+ ## Releasing New Versions
223
+
224
+ ### Automated Release Process
225
+
226
+ SekiUI uses an automated npm publishing workflow that triggers when you push version tags to GitHub.
227
+
228
+ #### Using the Release Helper Script (Recommended)
229
+
230
+ The easiest way to create a new release:
231
+
232
+ ```bash
233
+ npm run release
234
+ ```
235
+
236
+ **What the script does:**
237
+ 1. Fetches the latest published version from npm
238
+ 2. Prompts you for the new version number
239
+ 3. Validates that the new version is greater than the latest
240
+ 4. **Rejects versions that are less than or equal to the latest**
241
+ 5. Creates a git tag with 'v' prefix (e.g., v1.0.0)
242
+ 6. Pushes the tag to GitHub
243
+ 7. Triggers the automated publish workflow
244
+
245
+ **Example:**
246
+ ```bash
247
+ $ npm run release
248
+
249
+ 🚀 SekiUI Release Helper
250
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
251
+ 📡 Fetching latest version from npm registry...
252
+ ✓ Current latest version on npm: 0.1.1
253
+
254
+ Minimum allowed version: 0.1.2
255
+
256
+ Enter new version: 0.1.0
257
+ ❌ Error: Version 0.1.0 is not greater than current version 0.1.1
258
+ Minimum allowed version: 0.1.2
259
+
260
+ Enter new version: 0.2.0
261
+ ✓ Version 0.2.0 is valid (greater than 0.1.1)
262
+
263
+ 📝 Creating git tag: v0.2.0
264
+ ✓ Tag created locally
265
+
266
+ 🚀 Pushing tag to origin...
267
+
268
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
269
+ ✅ Success! Tag v0.2.0 pushed to GitHub
270
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
271
+
272
+ 📦 The GitHub Actions workflow will now:
273
+ 1. Build the project
274
+ 2. Run tests
275
+ 3. Publish to npm as version 0.2.0
276
+
277
+ 🔍 Monitor progress at:
278
+ https://github.com/YourOrg/SekiUI/actions
279
+ ```
280
+
281
+ #### Manual Tag Creation (Alternative)
282
+
283
+ If you prefer to create tags manually:
284
+
285
+ ```bash
286
+ # Create a tag with 'v' prefix
287
+ git tag v1.0.0
288
+
289
+ # Push the tag to GitHub
290
+ git push origin v1.0.0
19
291
  ```
20
292
 
21
- ## Theming
22
- Use CSS parts and custom properties (e.g. `part="button"`).
293
+ **Important:** Always use the 'v' prefix (e.g., v1.0.0, not 1.0.0). The workflow only triggers on tags matching `v*.*.*`.
294
+
295
+ ### Versioning Guidelines
296
+
297
+ Follow [Semantic Versioning](https://semver.org/):
298
+
299
+ - **MAJOR** (v2.0.0): Breaking changes, removed features, changed API
300
+ - **MINOR** (v1.1.0): New features, backward-compatible enhancements
301
+ - **PATCH** (v1.0.1): Bug fixes, documentation updates, internal refactors
302
+
303
+ **Pre-release versions:**
304
+ - Alpha: v1.0.0-alpha.1, v1.0.0-alpha.2, ...
305
+ - Beta: v1.0.0-beta.1, v1.0.0-beta.2, ...
306
+ - Release Candidate: v1.0.0-rc.1, v1.0.0-rc.2, ...
307
+
308
+ Pre-release versions are published with the `next` tag on npm and won't be installed by default.
309
+
310
+ ### What Happens After Pushing a Tag
311
+
312
+ The automated GitHub Actions workflow:
313
+
314
+ 1. ✅ **Validates NPM_TOKEN** - Fails fast if secret is missing
315
+ 2. 📦 **Installs dependencies** - Clean install with `npm ci`
316
+ 3. 🔢 **Extracts version** - Strips 'v' prefix from tag
317
+ 4. 🔄 **Syncs package.json** - Updates version to match tag
318
+ 5. 🏗️ **Builds project** - Compiles TypeScript and generates dist/
319
+ 6. ✅ **Validates build** - Ensures dist/ folder exists
320
+ 7. 🚀 **Publishes to npm** - Uploads to npm registry
321
+ 8. 🏷️ **Applies dist-tag** - Uses `latest` for stable, `next` for pre-releases
322
+ 9. 📡 **Deploys to CDN** - Uploads to GitHub Pages (versioned path)
323
+ 10. 🔄 **Updates latest CDN** - Updates `/latest/` path for stable releases only
324
+ 11. 📋 **Reports URLs** - Logs CDN URLs in workflow output
325
+
326
+ ### Monitoring Workflow Status
327
+
328
+ After pushing a tag:
329
+
330
+ 1. Go to the **Actions** tab in GitHub
331
+ 2. Find the "Publish to npm" workflow
332
+ 3. Click to view real-time logs
333
+ 4. Green checkmark = successful publish
334
+ 5. Red X = failure (check logs for details)
335
+
336
+ ### First-Time Setup (Maintainers Only)
337
+
338
+ **One-time setup required before releasing:**
339
+
340
+ #### 1. NPM_TOKEN Setup
341
+
342
+ 1. **Generate npm token:**
343
+ - Log in to [npmjs.com](https://npmjs.com)
344
+ - Go to Account → Access Tokens
345
+ - Click "Generate New Token"
346
+ - Select **Automation** token type
347
+ - Copy the token (shown only once!)
348
+
349
+ 2. **Add token to GitHub:**
350
+ - Go to repository Settings → Secrets and variables → Actions
351
+ - Click "New repository secret"
352
+ - Name: `NPM_TOKEN`
353
+ - Value: Paste your npm token
354
+ - Click "Add secret"
355
+
356
+ #### 2. GitHub Pages Setup (CDN Deployment)
357
+
358
+ **Required for CDN deployment to work:**
359
+
360
+ 1. **Enable GitHub Pages:**
361
+ - Go to repository Settings → Pages
362
+ - Under "Source", select: **Deploy from a branch**
363
+ - Branch: **gh-pages** / (root)
364
+ - Click "Save"
365
+
366
+ 2. **What this enables:**
367
+ - Automatic CDN deployment after npm publish
368
+ - Versioned URLs: `https://sekiui.github.io/SekiUI/v1.0.0/sekiui.esm.js`
369
+ - Latest URL: `https://sekiui.github.io/SekiUI/latest/sekiui.esm.js`
370
+
371
+ 3. **Important notes:**
372
+ - CDN deployment is **non-blocking** - npm publish succeeds even if CDN fails
373
+ - First deployment creates the `gh-pages` branch automatically
374
+ - Pre-release versions deploy to versioned paths only (latest path not updated)
375
+
376
+ #### 3. Verify Setup
377
+
378
+ 1. Create a test tag (e.g., v0.1.0-test.1)
379
+ 2. Push the tag: `git push origin v0.1.0-test.1`
380
+ 3. Check GitHub Actions logs
381
+ 4. Verify:
382
+ - ✅ Package published to npm
383
+ - ✅ CDN URLs accessible (check workflow output for URLs)
384
+ 5. If successful, delete the test version from npm
385
+
386
+ ### Troubleshooting
387
+
388
+ **"NPM_TOKEN secret is not set"**
389
+ - Add NPM_TOKEN to repository secrets (see setup above)
390
+
391
+ **"You cannot publish over the previously published versions"**
392
+ - You're trying to publish a version that already exists
393
+ - Increment the version number and try again
394
+
395
+ **"Build did not generate dist/ folder"**
396
+ - Build failed due to TypeScript errors or configuration issues
397
+ - Fix the errors and create a new tag
398
+
399
+ **Tag pushed but workflow didn't run**
400
+ - Ensure tag matches pattern `v*.*.*` (with lowercase 'v')
401
+ - Check that workflow file exists in `.github/workflows/publish-npm.yml`
402
+
403
+ **Release script rejects valid version**
404
+ - Ensure `semver` CLI is installed: `npm install -g semver`
405
+ - Or proceed with basic validation (less accurate for pre-releases)
406
+
407
+ **CDN deployment failed but npm publish succeeded**
408
+ - This is expected behavior (non-blocking deployment)
409
+ - Check GitHub Pages is enabled in repository settings
410
+ - Verify `gh-pages` branch exists (created automatically on first deploy)
411
+ - CDN will be updated on next successful release
412
+ - jsDelivr CDN still works (auto-syncs from npm)
413
+
414
+ **CDN URLs not accessible**
415
+ - Wait 1-2 minutes for GitHub Pages to propagate
416
+ - Check GitHub Pages settings: Settings → Pages
417
+ - Verify workflow completed successfully (check Actions tab)
418
+ - Try jsDelivr URL as alternative: `https://cdn.jsdelivr.net/npm/@sekiui/elements@VERSION/dist/sekiui.esm.js`
419
+
420
+ ## Contributing
421
+
422
+ 1. Fork the repository
423
+ 2. Create a feature branch (`git checkout -b feature/amazing-component`)
424
+ 3. Make your changes
425
+ 4. Run tests (`npm test`)
426
+ 5. Commit your changes (`git commit -m 'feat: add amazing component'`)
427
+ 6. Push to your branch (`git push origin feature/amazing-component`)
428
+ 7. Open a Pull Request
23
429
 
24
430
  ## License
25
- MIT
431
+
432
+ MIT © SekiUI Team
@@ -0,0 +1,5 @@
1
+ 'use strict';
2
+
3
+ const globalScripts = () => {};
4
+
5
+ exports.globalScripts = globalScripts;
@@ -1,11 +1,10 @@
1
- const NAMESPACE = 'sekiui';
2
- const BUILD = /* sekiui */ { hydratedSelectorName: "hydrated", lazyLoad: true, updatable: true, watchCallback: false };
1
+ 'use strict';
3
2
 
4
- const globalScripts = () => {};
5
- const globalStyles = "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n/* shadcn/ui design tokens */\n@layer base {\n :root {\n --background: 0 0% 100%;\n --foreground: 222.2 84% 4.9%;\n --card: 0 0% 100%;\n --card-foreground: 222.2 84% 4.9%;\n --popover: 0 0% 100%;\n --popover-foreground: 222.2 84% 4.9%;\n --primary: 222.2 47.4% 11.2%;\n --primary-foreground: 210 40% 98%;\n --secondary: 210 40% 96%;\n --secondary-foreground: 222.2 84% 4.9%;\n --muted: 210 40% 96%;\n --muted-foreground: 215.4 16.3% 46.9%;\n --accent: 210 40% 96%;\n --accent-foreground: 222.2 84% 4.9%;\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 40% 98%;\n --border: 214.3 31.8% 91.4%;\n --input: 214.3 31.8% 91.4%;\n --ring: 222.2 84% 4.9%;\n --radius: 0.5rem;\n }\n\n .dark {\n --background: 222.2 84% 4.9%;\n --foreground: 210 40% 98%;\n --card: 222.2 84% 4.9%;\n --card-foreground: 210 40% 98%;\n --popover: 222.2 84% 4.9%;\n --popover-foreground: 210 40% 98%;\n --primary: 210 40% 98%;\n --primary-foreground: 222.2 47.4% 11.2%;\n --secondary: 217.2 32.6% 17.5%;\n --secondary-foreground: 210 40% 98%;\n --muted: 217.2 32.6% 17.5%;\n --muted-foreground: 215 20.2% 65.1%;\n --accent: 217.2 32.6% 17.5%;\n --accent-foreground: 210 40% 98%;\n --destructive: 0 62.8% 30.6%;\n --destructive-foreground: 210 40% 98%;\n --border: 217.2 32.6% 17.5%;\n --input: 217.2 32.6% 17.5%;\n --ring: 212.7 26.8% 83.9%;\n }\n}\n\n@layer base {\n * {\n @apply border-border;\n }\n body {\n @apply bg-background text-foreground;\n }\n}";
3
+ const NAMESPACE = 'sekiui';
4
+ const BUILD = /* sekiui */ { hydratedSelectorName: "hydrated", lazyLoad: true, propChangeCallback: false, updatable: true};
6
5
 
7
6
  /*
8
- Stencil Client Platform v4.37.1 | MIT Licensed | https://stenciljs.com
7
+ Stencil Client Platform v4.38.0 | MIT Licensed | https://stenciljs.com
9
8
  */
10
9
  var __defProp = Object.defineProperty;
11
10
  var __export = (target, all) => {
@@ -30,13 +29,17 @@ var registerHost = (hostElement, cmpMeta) => {
30
29
  $flags$: 0,
31
30
  $hostElement$: hostElement,
32
31
  $cmpMeta$: cmpMeta,
33
- $instanceValues$: /* @__PURE__ */ new Map()
32
+ $instanceValues$: /* @__PURE__ */ new Map(),
33
+ $serializerValues$: /* @__PURE__ */ new Map()
34
34
  };
35
35
  {
36
36
  hostRef.$onReadyPromise$ = new Promise((r) => hostRef.$onReadyResolve$ = r);
37
37
  hostElement["s-p"] = [];
38
38
  hostElement["s-rc"] = [];
39
39
  }
40
+ {
41
+ hostRef.$fetchedCbList$ = [];
42
+ }
40
43
  const ref = hostRef;
41
44
  hostElement.__stencil__getHostRef = () => ref;
42
45
  return ref;
@@ -56,36 +59,7 @@ var loadModule = (cmpMeta, hostRef, hmrVersionId) => {
56
59
  if (module) {
57
60
  return module[exportName];
58
61
  }
59
-
60
- if (!hmrVersionId || !BUILD.hotModuleReplacement) {
61
- const processMod = importedModule => {
62
- cmpModules.set(bundleId, importedModule);
63
- return importedModule[exportName];
64
- }
65
- switch(bundleId) {
66
-
67
- case 'seki-button':
68
- return import(
69
- /* webpackMode: "lazy" */
70
- './seki-button.entry.js').then(processMod, consoleError);
71
- case 'seki-card':
72
- return import(
73
- /* webpackMode: "lazy" */
74
- './seki-card.entry.js').then(processMod, consoleError);
75
- case 'seki-card-content':
76
- return import(
77
- /* webpackMode: "lazy" */
78
- './seki-card-content.entry.js').then(processMod, consoleError);
79
- case 'seki-card-header':
80
- return import(
81
- /* webpackMode: "lazy" */
82
- './seki-card-header.entry.js').then(processMod, consoleError);
83
- case 'seki-card-title':
84
- return import(
85
- /* webpackMode: "lazy" */
86
- './seki-card-title.entry.js').then(processMod, consoleError);
87
- }
88
- }
62
+ /*!__STENCIL_STATIC_IMPORT_SWITCH__*/
89
63
  return import(
90
64
  /* @vite-ignore */
91
65
  /* webpackInclude: /\.entry\.js$/ */
@@ -231,10 +205,7 @@ var unwrapErr = (result) => {
231
205
 
232
206
  // src/utils/style.ts
233
207
  function createStyleSheetIfNeededAndSupported(styles2) {
234
- if (!supportsConstructableStylesheets) return void 0;
235
- const sheet = new CSSStyleSheet();
236
- sheet.replaceSync(styles2);
237
- return sheet;
208
+ return void 0;
238
209
  }
239
210
 
240
211
  // src/utils/shadow-root.ts
@@ -242,7 +213,7 @@ var globalStyleSheet;
242
213
  function createShadowRoot(cmpMeta) {
243
214
  var _a;
244
215
  const shadowRoot = this.attachShadow({ mode: "open" });
245
- if (globalStyleSheet === void 0) globalStyleSheet = (_a = createStyleSheetIfNeededAndSupported(globalStyles)) != null ? _a : null;
216
+ if (globalStyleSheet === void 0) globalStyleSheet = (_a = createStyleSheetIfNeededAndSupported()) != null ? _a : null;
246
217
  if (globalStyleSheet) {
247
218
  if (supportsMutableAdoptedStyleSheets) {
248
219
  shadowRoot.adoptedStyleSheets.push(globalStyleSheet);
@@ -802,6 +773,11 @@ var dispatchHooks = (hostRef, isInitialLoad) => {
802
773
  }
803
774
  let maybePromise;
804
775
  if (isInitialLoad) {
776
+ {
777
+ if (hostRef.$fetchedCbList$.length) {
778
+ hostRef.$fetchedCbList$.forEach((cb) => cb(elm));
779
+ }
780
+ }
805
781
  maybePromise = safeCall(instance, "componentWillLoad", void 0, elm);
806
782
  } else {
807
783
  maybePromise = safeCall(instance, "componentWillUpdate", void 0, elm);
@@ -958,7 +934,7 @@ var setValue = (ref, propName, newVal, cmpMeta) => {
958
934
  var proxyComponent = (Cstr, cmpMeta, flags) => {
959
935
  var _a, _b;
960
936
  const prototype = Cstr.prototype;
961
- if (cmpMeta.$members$ || BUILD.watchCallback) {
937
+ if (cmpMeta.$members$ || BUILD.propChangeCallback) {
962
938
  const members = Object.entries((_a = cmpMeta.$members$) != null ? _a : {});
963
939
  members.map(([memberName, [memberFlags]]) => {
964
940
  if ((memberFlags & 31 /* Prop */ || (flags & 2 /* proxyState */) && memberFlags & 32 /* State */)) {
@@ -992,8 +968,6 @@ var proxyComponent = (Cstr, cmpMeta, flags) => {
992
968
  const currentValue = memberFlags & 32 /* State */ ? this[memberName] : ref.$hostElement$[memberName];
993
969
  if (typeof currentValue === "undefined" && ref.$instanceValues$.get(memberName)) {
994
970
  newValue = ref.$instanceValues$.get(memberName);
995
- } else if (!ref.$instanceValues$.get(memberName) && currentValue) {
996
- ref.$instanceValues$.set(memberName, currentValue);
997
971
  }
998
972
  origSetter.apply(this, [
999
973
  parsePropertyValue(
@@ -1008,7 +982,7 @@ var proxyComponent = (Cstr, cmpMeta, flags) => {
1008
982
  if ((flags & 1 /* isElementConstructor */) === 0 || (cmpMeta.$members$[memberName][0] & 4096 /* Setter */) === 0) {
1009
983
  setValue(this, memberName, newValue, cmpMeta);
1010
984
  if (flags & 1 /* isElementConstructor */ && !ref.$lazyInstance$) {
1011
- ref.$onReadyPromise$.then(() => {
985
+ ref.$fetchedCbList$.push(() => {
1012
986
  if (cmpMeta.$members$[memberName][0] & 4096 /* Setter */ && ref.$lazyInstance$[memberName] !== ref.$instanceValues$.get(memberName)) {
1013
987
  ref.$lazyInstance$[memberName] = newValue;
1014
988
  }
@@ -1029,7 +1003,9 @@ var proxyComponent = (Cstr, cmpMeta, flags) => {
1029
1003
  if (ref.$lazyInstance$) {
1030
1004
  setterSetVal();
1031
1005
  } else {
1032
- ref.$onReadyPromise$.then(() => setterSetVal());
1006
+ ref.$fetchedCbList$.push(() => {
1007
+ setterSetVal();
1008
+ });
1033
1009
  }
1034
1010
  }
1035
1011
  }
@@ -1042,14 +1018,15 @@ var proxyComponent = (Cstr, cmpMeta, flags) => {
1042
1018
  plt.jmp(() => {
1043
1019
  var _a2;
1044
1020
  const propName = attrNameToPropName.get(attrName);
1021
+ const hostRef = getHostRef(this);
1045
1022
  if (this.hasOwnProperty(propName) && BUILD.lazyLoad) {
1046
1023
  newValue = this[propName];
1047
1024
  delete this[propName];
1048
- } else if (prototype.hasOwnProperty(propName) && typeof this[propName] === "number" && // cast type to number to avoid TS compiler issues
1025
+ }
1026
+ if (prototype.hasOwnProperty(propName) && typeof this[propName] === "number" && // cast type to number to avoid TS compiler issues
1049
1027
  this[propName] == newValue) {
1050
1028
  return;
1051
1029
  } else if (propName == null) {
1052
- const hostRef = getHostRef(this);
1053
1030
  const flags2 = hostRef == null ? void 0 : hostRef.$flags$;
1054
1031
  if (hostRef && flags2 && !(flags2 & 8 /* isConstructingInstance */) && flags2 & 128 /* isWatchReady */ && newValue !== oldValue) {
1055
1032
  const instance = hostRef.$lazyInstance$ ;
@@ -1064,7 +1041,7 @@ var proxyComponent = (Cstr, cmpMeta, flags) => {
1064
1041
  }
1065
1042
  const propDesc = Object.getOwnPropertyDescriptor(prototype, propName);
1066
1043
  newValue = newValue === null && typeof this[propName] === "boolean" ? false : newValue;
1067
- if (newValue !== this[propName] && (!propDesc.get || !!propDesc.set)) {
1044
+ if (newValue != this[propName] && (!propDesc.get || !!propDesc.set)) {
1068
1045
  this[propName] = newValue;
1069
1046
  }
1070
1047
  });
@@ -1174,7 +1151,7 @@ var connectedCallback = (elm) => {
1174
1151
  }
1175
1152
  if (cmpMeta.$members$) {
1176
1153
  Object.entries(cmpMeta.$members$).map(([memberName, [memberFlags]]) => {
1177
- if (memberFlags & 31 /* Prop */ && elm.hasOwnProperty(memberName)) {
1154
+ if (memberFlags & 31 /* Prop */ && memberName in elm && elm[memberName] !== Object.prototype[memberName]) {
1178
1155
  const value = elm[memberName];
1179
1156
  delete elm[memberName];
1180
1157
  elm[memberName] = value;
@@ -1352,7 +1329,8 @@ var bootstrapLazy = (lazyBundles, options = {}) => {
1352
1329
  // src/runtime/nonce.ts
1353
1330
  var setNonce = (nonce) => plt.$nonce$ = nonce;
1354
1331
 
1355
- export { Host as H, bootstrapLazy as b, globalScripts as g, h, promiseResolve as p, registerInstance as r, setNonce as s };
1356
- //# sourceMappingURL=index-3X8Wsgjr.js.map
1357
-
1358
- //# sourceMappingURL=index-3X8Wsgjr.js.map
1332
+ exports.bootstrapLazy = bootstrapLazy;
1333
+ exports.h = h;
1334
+ exports.promiseResolve = promiseResolve;
1335
+ exports.registerInstance = registerInstance;
1336
+ exports.setNonce = setNonce;
@@ -1,3 +1,2 @@
1
1
  'use strict';
2
2
 
3
- //# sourceMappingURL=index.cjs.js.map
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-BxbILFLe.js');
3
+ var index = require('./index-6jIfEFyf.js');
4
+ var appGlobals = require('./app-globals-V2Kpy_OQ.js');
4
5
 
5
6
  const defineCustomElements = async (win, options) => {
6
7
  if (typeof window === 'undefined') return undefined;
7
- await index.globalScripts();
8
- return index.bootstrapLazy([["seki-button.cjs",[[257,"seki-button",{"variant":[1],"size":[1],"disabled":[4]}]]],["seki-card.cjs",[[257,"seki-card"]]],["seki-card-content.cjs",[[257,"seki-card-content"]]],["seki-card-header.cjs",[[257,"seki-card-header"]]],["seki-card-title.cjs",[[257,"seki-card-title"]]]], options);
8
+ await appGlobals.globalScripts();
9
+ return index.bootstrapLazy([["seki-button.cjs",[[257,"seki-button",{"variant":[1],"size":[1],"disabled":[4],"type":[1]}]]]], options);
9
10
  };
10
11
 
11
12
  exports.setNonce = index.setNonce;
12
13
  exports.defineCustomElements = defineCustomElements;
13
- //# sourceMappingURL=loader.cjs.js.map